https://www.acmicpc.net/problem/3107
설명
문자열 구현 문제다.
32자리의 16진수를 : 단위로 4개씩 구분한다.
이 때 두 가지 규칙이 존재한다.
1. 각 그룹의 앞자리의 0의 전체 또는 일부를 생략 할 수 있다.
2. 0으로만 이루어져 있는 그룹이 있을 경우 그 중 한 개 이상 연속된 그룹을 하나 골라 콜론 2개(::)로 바꿀 수 있다.
아래 세 가지 IPv6는 동일하다.
2001:0db8:85a3:0000:0000:8a2e:0370:7334
2001:db8:85a3:0:00:8a2e:370:7334
2001:db8:85a3::8a2e:370:7334
축약된 IPv6가 입력으로 들어오면 축약되지 않은 IPv6를 찾는 문제다.
우선 :의 개수를 셌다.
자리수는 항상 동일하므로 축약되지 않은 경우 콜론은 7개여야 한다.
이 콜론의 개수로 2번 규칙으로 숨겨진 0000의 개수를 찾는다.
그리고 해당 문자열을 생성해 :: 과 교체한다.
string tmp = ":";
for (int i = 0; i < 8 - cnt; i++) {
tmp += "0000:";
}
if (s.find("::") != string::npos) s.replace(s.find("::"), 2, tmp);
위의 과정을 거치면 2번 규칙으로 숨겨진 부분을 찾고, 콜론은 7개, 모든 콜론 사이에는 숫자가 존재한다.
여기서 발생하는 반례는 양 끝에 :: 이 존재 하는 경우다.
::1 과같은 입력이 들어온 경우 :0000:0000:0000:0000:0000:0000:1과 같은 결과가 나온다.
따라서 양끝에 :이 존재하는 경우 0000을 추가로 붙여줬다.
if (s[0] == ':') s = "0000" + s;
if (s[s.size() - 1] == ':') s = s + "0000";
이후 1번 규칙만 처리 해주면 된다.
콜론으로 구분된 모든 자리를 4자리로 통일해야 한다.
콜론을 기준으로 출력하기 때문에 마지막 부분은 출력되지 않아 그 부분만 마지막에 따로 처리한다.
tmp = "";
for (int i = 0; i < s.size(); i++) {
tmp += s[i];
if (s[i] == ':') {
while (tmp.size() < 5) tmp = "0" + tmp;
cout << tmp;
tmp = "";
}
}
최종코드
#include <iostream>
using namespace std;
string s;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> s;
int cnt = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == ':') cnt++;
}
string tmp = ":";
for (int i = 0; i < 8 - cnt; i++) {
tmp += "0000:";
}
if (s.find("::") != string::npos) s.replace(s.find("::"), 2, tmp);
if (s[0] == ':') s = "0000" + s;
if (s[s.size() - 1] == ':') s = s + "0000";
tmp = "";
for (int i = 0; i < s.size(); i++) {
tmp += s[i];
if (s[i] == ':') {
while (tmp.size() < 5) tmp = "0" + tmp;
cout << tmp;
tmp = "";
}
}
while (tmp.size() < 4) tmp = "0" + tmp;
cout << tmp;
}
'Algorithm > Implementation' 카테고리의 다른 글
[C++] BOJ(백준) 4920 테트리스 게임 (1) | 2024.02.09 |
---|---|
[C++] BOJ(백준) 17144 미세먼지 안녕! (1) | 2024.02.08 |
[C++] BOJ(백준) 10836 여왕벌 (0) | 2023.07.19 |
[C++] BOJ(백준) 14890 경사로 (0) | 2023.05.03 |
[C++] BOJ(백준) 10800 컬러볼 (0) | 2023.02.14 |