https://www.acmicpc.net/problem/1436
#include <stdio.h>
int end[10001];//종말 숫자 배열
int main()
{
int num;
scanf("%d", &num);
int i = 1;
int new_i;
int idx = 0;
while (idx != 10000)
{
int cnt = 0;
new_i = i;
while (new_i != 0)
{
if (new_i % 10 == 6) //연속해서 6이 나오면 cnt증가, 나오지 않으면 cnt = 0 으로 초기화
cnt++;
else
cnt = 0;
new_i /= 10;
if (cnt == 3) //cnt == 3 : 종말 숫자이면 (6이 연속해서 3개 나오는 수라면)
{
end[idx] = i; //종말 숫자 배열에 넣고 인덱스 증가
idx++;
}
}
i++;
}
printf("%d\n", end[num-1]);
}
나름대로의 해석을 달아봤습니다.
=> i를 1부터 증가시키면서 i가 종말숫자인지 아닌지 판별한다.
=> i를 일의자리, 십의 자리, 백의 자리... 처럼 자릿수 하나하나를 분리시키면서 그 수가 6이라면 cnt를 증가시킨다.
=> 그렇게 해서 cnt가 3이라면 종말숫자이기 때문에(6이 연속으로 3개 나왔다는 뜻)
종말숫자만 담아놓은 end배열에 넣어두고 idx를 증가시킨다.
=> 물론 6이 연속해서 3개가 나오는 경우도 종말숫자이지만, 3개 이상 나와도 종말숫자라고 문제에서 알려줬기 때문에, if (cnt == 3)을 if (cnt >= 3) 이라고 고쳐도 된다.
=> 물론 그렇게 된다면 idx++; 바로 밑에 break; 문을 추가시켜야 한다. cnt가 3이상인걸 확인하자마자 end배열에 그 수를 담고 반복문을 빠져나와야 하기 때문!
=>이 과정을 end의 인덱스인 idx가 10000이 되기 전까지 반복한다.
다시 말해, 종말 숫자가 (작은 순서대로) 10000개가 저장될때까지 반복한다.
'Problem Solving > 백준' 카테고리의 다른 글
[백준] 10996번 : 별 찍기 - 21 (0) | 2020.03.15 |
---|---|
[백준] 2523번: 별 찍기 - 13 (0) | 2020.03.15 |
[백준] 1932번 : 정수 삼각형 (0) | 2020.02.25 |
[백준] 2751번 : 수 정렬하기 2 (0) | 2020.02.24 |
[백준] 10773번 : 제로 (0) | 2020.02.24 |