반응형
문제 : https://www.acmicpc.net/problem/1436
서론
아이디어는 간단했지만, 구현 실수로 반례찾는데 시간 다 보낸 문제.
반례는 66066이 출력되는 문제가 발생.
원인은 6이 연속으로 3개 이상 포함되는지 확인하기 위한 코드에서 문제가 있었다.
아이디어
브루트포스 문제.
1부터 아주 큰 수까지 6이 연속으로 3번 들어가는지 확인하는 코드에 전부 집어넣는다.
6이 연속으로 3번 이상 들어가는지 확인하는 코드는
-
들어온 숫자의 자릿수를 분해
각 자리가 6이고 이전 자릿수도 6이면 카운트 증가
카운트가 2 이상이면 6이 3개이상이므로 true
-
구현
34번째 줄 2666799는 n이 10000일때의 수
//c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n;
// 반례 : 66066
bool numSix(int input) {
int cur = 0;
int prev = 0;
int cnt = 0;
while (1) {
if (input == 0) break;
prev = cur;
cur = input % 10;
input /= 10;
if (cur == 6 && prev == cur) {
cnt++;
if (cnt >= 2) return true;
}
else cnt = 0;
}
return false;
}
int main() {
vector<int>v;
cin >> n;
for (int i = 1; i <= 2666799; i++) {
if (numSix(i) == true) v.push_back(i);
}
cout << v[n - 1];
//for (int i = 0; i < n; i++) cout << v[i] << endl;
}
최근댓글