본문 바로가기
코딩테스트

[백준] 2064번 'IP 주소' - Java

by CuckooBird 2023. 7. 10.

문제


코드

Try1. 틀렸습니다가 뜬 코드입니다. - 코드 길이 3326B

import java.io.*;
import java.util.*;

public class Main {
	private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	
	public static void main(String[] args) throws IOException {
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		
		int[] max = {0, 0, 0, 0};
		int[] min = {255, 255, 255, 255};
		
		for(int i = 0 ; i < n ; i++) {
			st = new StringTokenizer(bf.readLine(), ".");
			int[] tmp = new int[4];
			int flag_max = 0;
			int flag_min = 0;
			for(int j = 0 ; j < 4 ; j++) {
				tmp[j] = Integer.parseInt(st.nextToken());
				if(max[j] <= tmp[j]) flag_max ++;
				if(min[j] >= tmp[j]) flag_min ++;
			}
			if(flag_max == 4) max = tmp;
			if(flag_min == 4) min = tmp;
		}
		char[] max_char = new char[32];
		char[] min_char = new char[32];
		for(int i = 0 ; i < 4 ; i++) {
			String maxBinary = String.format("%8s", Integer.toBinaryString(max[i])).replace(' ', '0');
		    String minBinary = String.format("%8s", Integer.toBinaryString(min[i])).replace(' ', '0');
			for(int j = 7 ; j >= 0 ; j--) {
				max_char[j + 8 * i] = maxBinary.charAt(j);
		        min_char[j + 8 * i] = minBinary.charAt(j);
			}
		}
		char[] one = {'0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '1'};
		int[] network_add = Binary_minus(min_char, one);
		for(int i = 0 ; i < 4 ; i++) {
			bw.write(Integer.toString(network_add[i]));
			if(i < 3) {
				bw.write(".");
			}
		}
		bw.write("\n");
		int[] sub_arr = Binary_minus(max_char, min_char);
		int sub_result = 0;
		for(int i = 0 ; i < 4 ; i++) {
			sub_result += Math.pow(256, (3 - i)) * sub_arr[i];
		}
		
		int m = 0;
		while(true) {
			if(Math.pow(2, m) < sub_result) m ++; 
			else break;
			
		}
		char[] networkmask_bin = new char[32];
		for(int i = 0 ; i < 32 ; i++) {
			if(i < 32 - m) {
				networkmask_bin[i] = '1';
			} else {
				networkmask_bin[i] = '0';
			}
		}
		
		
		int[] networkmask = new int[4];
		for(int i = 0 ; i < 4 ; i++) {
			int sum = 0;
			for(int j = 7 ; j >= 0 ; j--) {
				if(networkmask_bin[j + 8 * i] == '1') sum += Math.pow(2, 7 - j);
			}
			networkmask[i] = sum;
		}
		for(int i = 0 ; i < 4 ; i++) {
			bw.write(Integer.toString(networkmask[i]));
			if(i < 3) {
				bw.write(".");
			}
		}
		
		bf.close();
		bw.flush();
		bw.close();
	}
	
	private static int[] Binary_minus(char[] bin1, char[] bin2) {
        char[] ans = new char[32];
        for (int i = 31; i >= 0; i--) {
            int bin1Int = bin1[i] - '0';
            int bin2Int = bin2[i] - '0';
            if (bin1Int < bin2Int) {
                ans[i] = (char) (2 - bin2Int + '0');
                bin1[i - 1] = '0';
            } else {
                ans[i] = (char) (bin1Int - bin2Int + '0');
            }
        }
        int[] ans_bin = new int[4];
        String str = new String(ans);
        int sub_result = 0;
        for (int i = 0; i < 4; i++) {
            ans_bin[i] = Integer.parseInt(str.substring(i * 8, (i + 1) * 8), 2);
//            sub_result += Math.pow(256, (3 - i)) * ans_bin[i];
        }
        return ans_bin;
    }
}

Binary_minus 함수에서 .0으로 끝나는 곳에서 1을 뺄 때 1이 더해지는 오류가 있었습니다.

 

Try2. 틀렸습니다가 뜬 코드입니다. - 코드 길이 3402B

import java.io.*;
import java.util.*;

public class Main {
	private static final BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
	private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	
	public static void main(String[] args) throws IOException {
		StringTokenizer st = new StringTokenizer(bf.readLine());
		
		int n = Integer.parseInt(st.nextToken());
		
		int[] max = {0, 0, 0, 0};
		int[] min = {255, 255, 255, 255};
		
		for(int i = 0 ; i < n ; i++) {
			st = new StringTokenizer(bf.readLine(), ".");
			int[] tmp = new int[4];
			boolean flag_max = true;
			boolean flag_min = true;
			for(int j = 0 ; j < 4 ; j++) {
				tmp[j] = Integer.parseInt(st.nextToken());
				if(max[j] <= tmp[j] && flag_max) flag_max = true;
				else flag_max = false;
				if(min[j] >= tmp[j] && flag_min) flag_min = true;
				else flag_min = false;
			}
			if(flag_max) max = tmp;
			if(flag_min) min = tmp;
		}
		char[] max_char = new char[32];
		char[] min_char = new char[32];
		for(int i = 0 ; i < 4 ; i++) {
			String maxBinary = String.format("%8s", Integer.toBinaryString(max[i])).replace(' ', '0');
		    String minBinary = String.format("%8s", Integer.toBinaryString(min[i])).replace(' ', '0');
			for(int j = 7 ; j >= 0 ; j--) {
				max_char[j + 8 * i] = maxBinary.charAt(j);
		        min_char[j + 8 * i] = minBinary.charAt(j);
			}
		}
		char[] one = {'0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '0'
        		, '0', '0', '0', '0', '0', '0', '0', '1'};
		int[] network_add = Binary_minus(min_char, one);
		for(int i = 0 ; i < 4 ; i++) {
			bw.write(Integer.toString(network_add[i]));
			if(i < 3) bw.write(".");
		}
		bw.write("\n");
		
		int[] sub_arr = Binary_minus(max_char, min_char);
		int sub_result = 0;
		for(int i = 0 ; i < 4 ; i++) {
			sub_result += Math.pow(256, (3 - i)) * sub_arr[i];
		}
		
		int m = 0;
		while(true) {
			if(Math.pow(2, m) < sub_result) m ++; 
			else break;
			
		}
		
		char[] networkmask_bin = new char[32];
		for(int i = 0 ; i < 32 ; i++) {
			if(i < 32 - m) {
				networkmask_bin[i] = '1';
			} else {
				networkmask_bin[i] = '0';
			}
		}
		
		int[] networkmask = new int[4];
		for(int i = 0 ; i < 4 ; i++) {
			int sum = 0;
			for(int j = 7 ; j >= 0 ; j--) {
				if(networkmask_bin[j + 8 * i] == '1') sum += Math.pow(2, 7 - j);
			}
			networkmask[i] = sum;
		}
		for(int i = 0 ; i < 4 ; i++) {
			bw.write(Integer.toString(networkmask[i]));
			if(i < 3) bw.write(".");
		}
		
		bf.close();
		bw.flush();
		bw.close();
	}
	
	private static int[] Binary_minus(char[] bin1, char[] bin2) {
        char[] ans = new char[32];
        int r = 0;
        for (int i = 31; i >= 0; i--) {
            int bin1Int = bin1[i] - '0';
            int bin2Int = bin2[i] - '0';
            r += bin1Int - bin2Int;
            if (r < 0) {
            	r += 2;
            	if(r == 0) ans[i] = '0';
            	else ans[i] = '1';
            	r = -1;
            } else {
            	if(r == 0) ans[i] = '0';
            	else ans[i] = '1';
            	r = 0;
            }
        }
        int[] ans_bin = new int[4];
        String str = new String(ans);
        for (int i = 0; i < 4; i++) {
            ans_bin[i] = Integer.parseInt(str.substring(i * 8, (i + 1) * 8), 2);
        }
        return ans_bin;
    }
}

max와 min값을 구하는데에서 오류가 나서 고치는 도중인데 아무리 해봐도 잘 나오지가 않네요.. 너무 이 방법에만 취중하다보니 본래의 문제 의도에서 너무 빗겨가는 것 같아서 차라리 찾아보는게 나을 듯 싶었습니다.

 

후에 다시 해보겠습니다.