Study/Algorithm

[BOJ] 백준 3107번: IPv6_자바(JAVA)

delay100 2024. 6. 4. 15:56
728x90
반응형

1. 문제

https://www.acmicpc.net/problem/2615

*반례

입력 1111:11:: ::111
출력 1111:0011:0000:0000:0000:0000:0000:0000 0000:0000:0000:0000:0000:0000:0000:0111

2. 접근 및 해결

2-1) 접근

1. s[] = 입력 문자열을 ":"로 나누기

 

2. valid = 나눈 문자열들 중 길이가 1이상인 문자열의 개수를 찾기

 

3. s[]에서 한 문자열(str)씩 가져오기

3-1. 문자열이 ""인 경우

=> 비어있는 공간이므로  해당 부분을 8-valid번 "0000"을 추가해야 함(8은 32자리를 4로 나눈 수)

3-2. 현재 문자열의 길이가 1~4인 경우

=> 문자열을 4자리로 만들어서 sb(StringBuilder)에 추가

 

4. sb가 32자리가 아닌 경우 32자리로 만들어줌(가장 뒤에 ::가 나오는 경우에 대한 처리)

=> 여기까지하면 sb값이 "00000000000000000000000000000111"와 같이 ":" 없이 만들어짐

 

5. 4자리씩 끊어서 ":"를 추가하여 출력

 

2-2) 해결

핵심 코드인 3~4부분의 코드는 아래와 같습니다.

 for(String str: s) {
        int strLength = str.length();
        // 3-1. 문자열이 ""인 경우
        if(strLength==0) {
            while((8-valid)>0) { // ::인 경우에 대한 처리, 길이가 1이상의 문자열을 제외한 개수만큼 0을 넣어줌
                sb.append("0000");
                valid++;
            }
        } else {
        // 3-2. 현재 문자열의 길이가 1~4인 경우
        // 현재 문자의 길이가 4가 아닌 경우, 앞에 0을 추가하여 현재 문자의 길이를 4로 만듦
            for(int i=0; i<4-strLength; i++) {
                sb.append("0");
            }
            sb.append(str);
        }
    }
    
    // 4. sb가 32자리가 아닌 경우 32자리로 만들어줌(가장 뒤에 ::가 나오는 경우에 대한 처리)
    while(sb.toString().length()<32) { // 만약 32자리가 안되면 "0000"을 추가해서 32자리로 만듦
                                       // 가장 뒤에 ::가 붙는 경우에 대한 처리임
        sb.append("0000");
    }

3. 코드(JAVA) 

전체 코드는 아래와 같습니다.

// 메모리 : 11516KB
// 시간 : 80ms
import java.io.*;

public class Main {
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] s = br.readLine().split(":");

        // 길이가 1이상의 문자열의 개수 찾기
        int valid=0;
        for(String str: s) {
        	int strLength = str.length();
        	if(strLength>0) {
        		valid++;
        	}	
    	}
        
        StringBuilder sb = new StringBuilder();
        
        for(String str: s) {
        	int strLength = str.length();
        	if(strLength==0) {
        		while((8-valid)>0) { // ::인 경우에 대한 처리, 길이가 1이상의 문자열을 제외한 개수만큼 0을 넣어줌
        			sb.append("0000");
        			valid++;
        		}
        	} else { // 현재 문자의 길이가 4가 아닌 경우, 앞에 0을 추가하여 현재 문자의 길이를 4로 만듦
        		for(int i=0; i<4-strLength; i++) {
        			sb.append("0");
        		}
        		sb.append(str);
        	}
        }
        while(sb.toString().length()<32) { // 만약 32자리가 안되면 "0000"을 추가해서 32자리로 만듦
        								   // 가장 뒤에 ::가 붙는 경우에 대한 처리임
			sb.append("0000");
        }

        int i=0;
        for(; i<28; i+=4) {
            bw.write(sb.toString().substring(i, i+4)+":"); // 4자리씩 끊어서 :를 붙혀줌
        }
        bw.write(sb.toString().substring(i, i+4)); // 마지막 4자리는 :없이 출력

        br.close();
        bw.close();
    }
}

감사합니다!
728x90
반응형