컴퓨터공학 💻 도서관📚

백준 1436번 영화감독 숌 (복습) --> c언어 버전 풀이 아이디어 본문

💣😝알고리즘 문제(CAM)/C언어

백준 1436번 영화감독 숌 (복습) --> c언어 버전 풀이 아이디어

들판속초록풀 2024. 8. 25. 16:56
#include <stdio.h>

int i, temp, check, cnt = 1;
int main(void)
{
    int series;
    scanf("%d", &series);
    if (series == 1)           // 첫 번쨰 답 666은 따로 뺌
    {
        printf("666");
        return 0;
    }
    for (i = 667;; i++)     // 그 다음 작은 수 667부터 1씩 증가시킴 , 종료조건 안 씀
    {
        temp = i;         // i의 값으로 잠시 연산을 해야 해서 임시변수 temp 에 i 값 담기
        check = 0;
        while (temp)      // 밑에서 설명
        {
            if (temp % 1000 == 666)      //1000으로 나누는 신의 한 수 테크닉
            {                            //why? : 두 번째 답부터 네자리 수이기 때문
            
                check = 1;            // check 해 놓고 밑에 함수에서 승부 보기
            }
            temp /= 10;                 // 10으로 나누는 2번째 신의 한 수 테크닉
        }                               // 이 코드 한 줄로 6660 도 찾을 수 있다.
                              // 1의 자리가 6인 아닌 6660 같은 수들을 찾기 위해 10으로 나눔
                              
        if (check)       // 밑에서 설명
        {
            cnt++;
            if (cnt == series)
            {
                break;             // 답이면 break 로 반복문 비상탈출 하기
            }
        }
    }
    printf("%d\n", i);
    return 0;
}

 
 

[ 검색하며 새롭게 알게 된 사실 ]
while (temp)  == while(temp != 0)                // 이 둘이 같은 의미라고 한다.
if (check)  ==  if(check != 0) 
 
C언어 if문은 0일 때 거짓,  0이 아닐 때 참으로 동작한다

 
 

생각 알고리즘
                       [666은 따로 뺌]
                [for문으로 667부터 확인]
        [while문으로 temp(= i)  0인지 확인]
                    [if로 666 있는지 확인]
  [참: check 해두기]                   [거짓: X]
       [temp 10으로 나눠서 0 될 때까지 나누기]
 
                  [if로 check 해둔 수인지 확인]
  [참: cnt 1 증가시키기]                     [거짓: X]
                     [if로 cnt가 답이 맞는지 확인]
[참: break로 for문 빠져나오기]        [거짓: for문 i++로 다음 수 확인]

 
 
 
 

[ 2024. 8. 31 토 추가 복습]  :  직접 코딩해보고 느낀 점 
17번 줄의 while문을 작성하는 것이 제일 어렵다...
파이썬 같이 좋은 내장 함수가 없으니  while문 조건으로 temp가 0이 될 때까지 검사를 진행해야 한다. 
그리고 미친 테크닉 2개로 게임을 끝낸다.....

 


연속된 6 , 666이 있어야 한다는 것을 --> 수학적으로 끌고 와서  1000으로 나눴을 때 나머지가 666이어야 한다는 아이디어를 도출함

6660은 10으로 나누면 666 이 됨 --> 6660이 불편하면 너가 666으로 만들면 됨

 


굳이 check = 1 이 코드가 필요한가? , check라는 변수가 굳이 필요한가???  
라는 의문에서 시작해서 check를 없애고 코드를 바꿔봄 --> 그랬더니 됨

#include <stdio.h>

int i, temp, cnt = 1;
int main(void)
{
    int series;
    scanf("%d", &series);
    if (series == 1)           // 첫 번쨰 답 666은 따로 뺌
    {
        printf("666");
        return 0;
    }
    for (i = 667;; i++)     // 그 다음 작은 수 667부터 1씩 증가시킴 , 종료조건 안 씀
    {
        temp = i;         // i의 값으로 잠시 연산을 해야 해서 임시변수 temp 에 i 값 담기
        
        while (temp != 0)
        {
            if (temp % 1000 == 666)      //1000으로 나누는 신의 한 수 테크닉
            {                            //why? : 두 번째 답부터 네자리 수이기 때문
                
                cnt++;           
                break;
            }
            temp /= 10;                 // 10으로 나누는 2번째 신의 한 수 테크닉
        }                               // 이 코드 한 줄로 6660 도 찾을 수 있다.
                              // 1의 자리가 6인 아닌 6660 같은 수들을 찾기 위해 10으로 나눔
                              
        if (cnt == series)
        {
            printf("%d\n", i);
            break;
        }
    }

    return 0;
}

'💣😝알고리즘 문제(CAM) > C언어' 카테고리의 다른 글

백준 1076번  (0) 2022.01.19
Comments