[Java] 백준 BOJ / 2064번: IP 주소

개미개미개·2025년 5월 7일

Algorithm

목록 보기
57/63

IP 주소

문제


문제 설명

IP네트워크는 네 개의 바이트로 이루어져있고 각 바이트는 0부터 255까지의 값을 가진다.

이 때 앞의 32-m 자리는 0 또는 1로 이루어져 있고 뒤의 m자리는 0으로 채워진다.

이와 같은 IP네트워크에는 앞의 32-m 자리가 네트워크 주소와 일치하는 모든 IP들이 포함되게 된다.

이때, 어떤 네트워크에 속해있는 IP 주소들이 주어졌을 때, 네트워크 주소와 네트워크 마스크를 구해내는 프로그램이다.


구현

일단 입력으로 들어오는 IP 주소들을 저장할 배열을 선언하고 이 배열을 . 을 기준으로 나누어 분리한다.

ip = new String[n][4];
for (int i = 0; i < n; i++) {
	ip[i] = br.readLine().split("\\.");
}

이제 4바이트 각각에 대하여 AND 연산과 OR 연산을 해준다.

AND 연산은 공통된 비트를 구하고 OR 연산은 달라지는 비트를 구하는 방법이다.

이렇게 나온 결과로 주소의 최소와 최댓값을 도출하고, 최소와 최대가 같으면, 네트워크 주소에 추가하고 그렇지 않다면 달라지는 부분이 생겼다는 뜻이니 해당 바이트부터는 모두 0으로 바꾸면 된다.

for (int j = 1; j < n; j++) {
	min = min & Integer.parseInt(ip[j][i]);
	max = max | Integer.parseInt(ip[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;
}

코드

import java.io.*;
import java.util.*;
public class Main_2064 {
    static int n;
    static String[][] ip;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder network = new StringBuilder();
        StringBuilder subnet = new StringBuilder();
        n = Integer.parseInt(br.readLine());

        ip = new String[n][4];
        for (int i = 0; i < n; i++) {
            ip[i] = br.readLine().split("\\.");
        }

        boolean flag = false;
        for (int i = 0; i < 4; i++) {
            int min = Integer.parseInt(ip[0][i]);
            int max = Integer.parseInt(ip[0][i]);

            for (int j = 1; j < n; j++) {
                min = min & Integer.parseInt(ip[j][i]);
                max = max | Integer.parseInt(ip[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.println(network);
        System.out.println(subnet);
    }
}
profile
개미는 오늘도 일을 합니다.

0개의 댓글