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
반응형