본문 바로가기
Algorithm/백준

백준 1436 영화감독 숌 - C++

by 강깅꽁 2020. 7. 21.
반응형

접근

얼핏 보면 1666, 2666, 3666으로 증가폭이 1000으로 규칙성이 있어 보이지만 예외사항이 존재한다 6천번대로 진입하면

6660, 6661, 이런 식으로 규칙성에 예외사항이 생긴다. 

약간 3,6,9 하면 30번대에 항상 박수를 치는 것과 비슷한 느낌이다. 

그리고 N이 10,000까지다. 즉 N이 2일 때 1666인 걸 감안하면 N이 커지면 10666, 16660 뭐 이런 식의 시리즈도 생길 것이기 때문에 N이 커질수록 그에 맞는 규칙성을 파악하여 로직을 작성하는 것보다 최소한의 규칙(666을 포함)만 만족시키는 숫자를 지속적으로 찾게끔 로직을 만들어 주는 게 좋다.

 

#include <iostream>
#include <string>
using namespace std;
bool isThisEnd(int n){
    string str = to_string(n);
    int sixCnt = 0;
    for(int i=0; i<str.size(); i++){
        if(str[i] == '6') sixCnt++;
        else sixCnt = 0;
        
        if(sixCnt == 3) return true;
    }
    return false;
}

int main(){
    int N, cnt=0;
    cin >> N;
    for(int i=666; ;i++){
        if( isThisEnd(i) ) {
            cnt++;
            if(cnt == N) {
                cout << i;
                return 0;
            }
        }
    }
    return 0;
}

코드

n이 1666이라고 가정하고 string으로 바꾼다.

"1666"이 될 텐대 각 자릿수를 돌면서 6이 연속으로 3번 있는지 확인한다. -> 6이 연속 3번이면 666이기 때문에

중간에 6이 아닌 다른 수가 오면 sixCnt는 0으로 초기화한다.

여기서 나처럼 인티저에서 string으로 바꿔서 각 자릿수를 확인해 줘도 되고

10으로 나눈 나머지 값을 이용해서 각 자릿수를 확인해도 된다.

1666 % 10은 나머지가 6이다.