BOJ

백준 1436번 영화감독 숌 [C언어]

Sloth Coder 2022. 8. 7. 23:56

Sol1) 문자열과 동적 할당을 이용한 풀이 -> 메모리와 시간 많이 사용.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int n, cnt = 0;

    scanf("%d", &n);

    for(long long i = 666;;i++){

        int len = 0; //i의 자릿수를 저장할 변수
        long long temp = i;
        while(temp > 0){ //계속 자릿수를 하나씩 깎아나가며 len 카운트.
            temp /= 10;
            len++;
        }

        char *num = malloc(sizeof(char) * (len + 1)); //NULL까지 고려해 len + 1만큼 메모리 할당
        sprintf(num,"%lld", i); //sprintf함수로 정수를 문자열로 저장.

        if(strstr(num, "666") != NULL){ //strstr함수는 해당 문자를 찾지 못하면 NULL을 리턴한다.
            cnt++;                     //문자열을 찾았을 때 = NULL을 리턴하지 않았을 때 카운트.
        }

        if(cnt == n){ //카운트 수와 입력된 수가 같으면 해당 수 출력 후 프로그램 종료.
            printf("%s\n", num);
            return 0;
        }
    }

}

 

Sol2) 문자열로 변환하지 않고 정수 그대로 처리

#include <stdio.h>

int main()
{
    int n, cnt = 0;

    scanf("%d", &n);

    for(long long i = 666;;i++){

        if(i % 1000 == 666) //연속된 세 수를 구하는 방법
            cnt++;

        else{
            long long temp = i;
            while(temp > 0){ //만일 666이 일의자리부터 백의자리까지 있지 않을 경우, 자릿수를 하나씩 깎으며
                temp /= 10;  //세자리수 단위로 체크.
                if(temp % 1000 == 666){
                    cnt++;
                    break;
                }
            }
        }

        if(cnt == n){
            printf("%lld\n", i);
            return 0;
        }
    }
}

 

 

연속된 정수의 포함 여부를 정수 그대로 처리하는 법을 배웠다.

'BOJ' 카테고리의 다른 글

백준 2747번 피보나치 수 [C언어]  (0) 2022.08.15
백준 2863번 이게 분수? [C언어]  (0) 2022.08.13
백준 1018번 체스판 다시 칠하기 [C언어]  (0) 2022.08.10
백준 1977번 완전제곱수 [C언어]  (0) 2022.08.08
#2577(java)  (0) 2022.07.02