[Baekjoon] 12787/지금 밥이 문제냐/Python/Java/파이썬/자바

·2025년 3월 29일
0

문제풀이

목록 보기
56/56
post-thumbnail

💡문제

평소에 전공 공부를 열심히 하는 황제는 시험기간에 형들이 IPv4, IPv6주소를 저장하는데 각각 최소 4바이트, 6바이트가 필요하다는 얘기를 듣고 아람이에게 질문했다.

  • 황제: "IPv8주소를 저장하는데는 최소 몇 바이트의 공간이 필요할까?"
  • 아람: "당연히 8바이트의 공간이 필요하지"
  • 황제: "아하! 그러면 127.0.0.1이라는 IPv4 주소는 컴퓨터는 모든 수를 이진수로만 저장 하니까 127=01111111, 0=00000000, 0=00000000, 1=00000001로 저장되겠군. 그런데 이 4개의 값은 따로 저장 되는 것이 아니라 하나의 부호가 없는 정수형 변수에 저장되니까 이 변수에는 위 4개의 이진수를 이어 붙인 01111111000000000000000000000001가 저장되겠구나. 음...십진수로 출력하면 2130706433이겠네. "
  • 아람: "응 그렇지"
  • 황제: "그러면 어떤 IPv8주소가 부호가 없는 정수형 변수에 저장 될 때 그 값을 십진수로 바꾸면 어떤 값이 나올까?? 그리고 만약 어떤 부호가 없는 정수를 IPv8 주소로 바꾼다면 어떻게 바꿔줘야 될까?"
  • 아람: "..... 배고프다.. 밥이나 먹으러 가자!"
    그러자 황제는 고민이 해결될 때까지는 밥을 못 먹으러 간다며 자리를 지킨다.

여러분이 황제를 도와 아람이와 황제가 점심시간에 맞춰 밥을 먹도록 도와주자.

입력

입력의 첫째 줄에 테스트 케이스 T가 주어진다.

각 테스트 케이스의 첫 줄에는 변환의 종류를 나타내는 값 M과 변환할 값 N이 주어진다.

M은 IPv8 주소를 부호가 없는 정수로 바꾸는 변환이면 1, 부호가 없는 정수를 IPv8 주소로 바꾸는 변환이면 2가 주어진다.

N은 M이 1일 경우 0~255사이의 정수로 이루어진 IPv8 주소, M이 2일 경우 부호가 없는 정수가 주어진다.

주어지는 부호가 없는 정수의 크기는 64비트 부호가 없는 정수의 범위를 넘어가지 않는다.

출력

각 테스트 케이스마다 변환된 값을 출력한다.

예제입력

3
1 70.236.217.197.157.238.150.80
2 5110699119940114000
2 0

예제출력

5110699119940114000
70.236.217.197.157.238.150.80
0.0.0.0.0.0.0.0

📖내가 작성한 Code

import sys

'''
그냥 구현인데?
'''


def change_to_ipv8(string):
    change_to_bin = bin(int(string))[2:].zfill(64)
    answer = []
    for i in range(0, len(change_to_bin), 8):
        answer.append(str(int(change_to_bin[i:i+8], 2)))
    return ".".join(answer)+'\n'


def change_to_num(string):
    array = string.split('.')
    bin_string = ""
    for num in array:
        bin_string += bin(int(num))[2:].zfill(8)

    return str(int(bin_string, 2))+'\n'


def main():
    inputs = sys.stdin.read().split()
    t = int(inputs[0])
    for i in range(1, t*2+1, 2):
        if inputs[i] == '1':
            sys.stdout.write(change_to_num(inputs[i+1]))
        else:
            sys.stdout.write(change_to_ipv8(inputs[i+1]))


if __name__ == '__main__':
    main()

✍️풀이과정

또 나와버린 단순 구현 문제.

이제는 실버 2~부터 골드 3까지 랜덤 디펜스를 할 예정. 그리고 gibhub 블로그를 해볼 생각이다. 다 만들면 이동 예정.


🧠 코드 리뷰

  1. 리스트 컴프리헨션 활용: change_to_num() 함수 내에서 문자열을 누적하는 대신, 리스트 컴프리헨션을 사용해 "".join([...]) 방식으로 변경하면 코드가 조금 더 간결해질 수 있습니다.

🛠️Java 연습 코드

import java.io.*;
import java.math.BigInteger;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        FastReader fr = new FastReader();
        int t = fr.nextInt();
        StringBuilder sb = new StringBuilder();
        
        for (int i = 0; i < t; i++) {
            String mode = fr.next();
            if (mode.equals("1")) {
                String ip = fr.next();
                String[] parts = ip.split("\\.");
                StringBuilder binBuilder = new StringBuilder();
                for (String part : parts) {
                    int num = Integer.parseInt(part);
                    String binPart = Integer.toBinaryString(num);
                    binPart = String.format("%8s", binPart).replace(' ', '0');
                    binBuilder.append(binPart);
                }

                BigInteger result = new BigInteger(binBuilder.toString(), 2);
                sb.append(result.toString()).append("\n");
            } else if (mode.equals("2")) {

                String numStr = fr.next();
                BigInteger number = new BigInteger(numStr);

                String bin = number.toString(2);
                bin = String.format("%64s", bin).replace(' ', '0');
                
                String[] ipParts = new String[8];

                for (int j = 0; j < 8; j++) {
                    String segment = bin.substring(j * 8, (j + 1) * 8);
                    int partValue = Integer.parseInt(segment, 2);
                    ipParts[j] = String.valueOf(partValue);
                }
                sb.append(String.join(".", ipParts)).append("\n");
            }
        }
        System.out.print(sb.toString());
    }


    static class FastReader {
        BufferedReader br;
        StringTokenizer st;

        public FastReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() throws IOException {
            while (st == null || !st.hasMoreElements()) {
                st = new StringTokenizer(br.readLine());
            }
            return st.nextToken();
        }

        int nextInt() throws IOException {
            return Integer.parseInt(next());
        }

        long nextLong() throws IOException {
            return Long.parseLong(next());
        }

        double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }

        String nextLine() throws IOException {
            return br.readLine();
        }
    }
}

💻결과

백준문제 보러가기


🖱️참고 링크

문자열 자르기(파싱) 참고

profile
우물 안에서 무언가 만드는 사람

0개의 댓글