문제
https://www.acmicpc.net/problem/3107
풀이
힘들었다.
로직을 몇개로 나눌 수 있었다.
처음에는 비어있지 않은 구역의 수를 헤아리는 것이다. 총구역의 수는 8개이다.
빈 구역의 수를 저장한 후 다음 로직에서 ::이 보이면 빈구역만틈 0000을 넣는다.
i번째에서 :말고 다른 것들이 나오게된다면 tmp나 임시변수에 쌓으면서 :가 보일때 넣는다
주의할점은 i가 s.size() -1 즉 끝부분에 다달았을 경우에는 다음번에 :가 보이지 않으니 바로 합체(makeArea부분)를 해준다
소스
#include <bits/stdc++.h>
using namespace std;
string s, tmp, ans;
int areaCnt;
void doubleZero() {
for (int i = 0; i < 8 - areaCnt; i++)
{
for (int j = 0; j < 4; j++)
{
ans.push_back('0');
}
if (ans.size() != 39) ans.push_back(':');
}
}
void makeArea() {
for (int i = 0; i < 4 - tmp.size(); i++)
{
ans += '0';
}
ans += tmp;
tmp = "";
}
int main() {
cin >> s;
//빈 구역 헤아리기
bool Ok = false;
for (int i = 0; i < s.size(); i++)
{
if (s[i] != ':' && !Ok) {
areaCnt++;
Ok = true;
}
else if (s[i] == ':') {
Ok = false;
}
}
if (s[0] != ':') tmp = s[0];
for (int i = 1; i < s.size(); i++)
{
if (s[i] != ':') {
tmp += s[i];
//마지막부분에 왔을때는 모았던 tmp다 써버리기
if (i == (int)s.size() - 1) {
makeArea();
}
}
if (s[i] == ':') {
if (s[i - 1] == ':') {
doubleZero();
}
else
{
//지금까지 모았던 tmp정보들 ans에 넣기 넣고 tmp초기화
makeArea();
if (ans.size() != 39) ans += ':';
}
}
}
cout << ans;
return 0;
}
'알고리즘' 카테고리의 다른 글
격자위의 사각형갯수 구하는 수학 (1) | 2021.11.22 |
---|---|
최장증가수열 1편 가장 기초 (역추적 x), 백준 가장 긴 증가하는 부분 수열 (0) | 2021.11.19 |
Container With Most Water (0) | 2021.11.17 |
백준 7490 , 0 만들기, 문자열수식 백트래킹, (0) | 2021.11.17 |
백준 9251, dp, LCS (2가지 방법) (0) | 2021.11.15 |