05 Mar 2024

[Java] 백준 2064번: IP 주소

2064

풀이 방법

ipv4

IP주소와 Subnet mask에 대한 상관관계에 대한 이해가 있으면 난이도가 확 낮아지는 문제이다.

비트마스킹을 활용해 AND연산으로 주소의 최솟값과 최댓값을 도출한 뒤, 최솟값과 최댓값이 같다면 네트워크 주소에 계속 추가한다.

하지만 이 문제에는 함정이 있는데, 답이 여러 개인 경우에는 가장 크기가 작은(포함되는 IP 주소가 가장 적은, 즉 m이 최소인) 네트워크를 구하도록 한다. 라는 점이다. 그렇기 때문에 dot(.) 으로 나뉘는 구역에서 바뀌는 부분이 있다면 다음 구역부터는 0으로 적용하면 네트워크의 최솟값을 구할 수 있다.

풀이 코드

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BOJ_2064_IP_주소 {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		StringBuilder network = new StringBuilder();
		StringBuilder subnet = new StringBuilder();
		
		String[][] ips = new String[T][4];
		for(int i=0; i<T; ++i) {
			ips[i] = br.readLine().split("\\.");
		}
		
		boolean flag = false;
		for(int i=0; i<4; ++i) {
			int min = Integer.parseInt(ips[0][i]);
			int max = Integer.parseInt(ips[0][i]);
			
			for(int j=1; j<T; ++j) {
				min = min & Integer.parseInt(ips[j][i]);
				max = max | Integer.parseInt(ips[j][i]);
			}
			
			if(!flag) {
				network.append(min).append('.');
				subnet.append(255 - (max - min)).append('.');
			} else {
				network.append(0).append('.');
				subnet.append(0).append('.');
			}
			
			if(min != max) flag = true;
		}

		network.deleteCharAt(network.length()-1);
		subnet.deleteCharAt(subnet.length()-1);
		System.out.print(network+"\n"+subnet);
	}
}
Thank You For Reading
SeungJun Jeon

점점 강해지고 있습니다.

comments powered by Disqus