1월 16일(월) - 브루트 포스(1436번)
1436번: 영화감독 숌
666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
최초 생각 정리
- "666"을 기준으로 왼쪽에 1~9가 (6을 후순위로 하며) 추가된 후에, "666" 기준 오른쪽에 0~9가 추가되며 숫자가 커진다
- 0~9가 추가되는 경우와 1~9가 추가되는 경우를 명확한 조건으로 나누기는 힘들어 보인다
- 따라서 666에서 시작한 변수 num 값을 while 문을 이용해서 1씩 증가시켜가며 조건에 맞는 수가 나올때까지 무한루프를 돌린다
- 666부터 하나씩 늘린 변수를, 10으로 나눈 나머지를 이용해서
1)각 자릿수가 6인지를 확인 2) 자릿수가 6이라면 3번 연속인지 확인하고
마지막에는 변수를 10으로 나누면서 자릿수를 줄여가도록 생각함
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
1. 666이 연속되어있는지를 알아보고, 10으로 나누는 계산을 num 에 직접 실행했더니 출력값이 전혀 다른 값으로 나옴
-> num 변수에는 무한루프안에서 1씩 증가만 시키고, 새롭게 만든 changing_num 변수에는 num 값을 똑같이 넣은 뒤에 각 자릿수를 뽑아내서 6이 연속되는지를 알아보는 과정과 10으로 나누는 계산을 진행하는것으로 변경
2. 입력된 n 에 해당하는, n번째 수를 찾기위한 과정에 대한 코드 진행과정이 막힘
아래의 풀이를 참고하며 수정함
-> if(count == n) break;에 해당하는 풀이를 while(1) 반복문 안이 아닌 밖에 잘못 써놓았다는 것을 참고하여 수정함
-> 추가로, 자릿수 변수 이름도 digit 이라고 선언하는게 더 직관적인 것 같아서 수정함
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
int num = 666;
int count = 0;
while (1)
{
int count_of_6 = 0;
int changing_num = num;
while (changing_num > 0)
{
int digit = changing_num % 10;
if (digit == 6)
{
count_of_6++;
}
else
{
count_of_6 = 0;
}
if (count_of_6 == 3)
{
count++;
break;
}
changing_num /= 10;
}
if (count == n)
{
break;
}
num++;
}
printf("%d", num);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(C언어) > 23년 1월' 카테고리의 다른 글
집합과 맵 - 14425번 (0) | 2023.01.19 |
---|---|
집합과 맵 - 10815번 (0) | 2023.01.17 |
브루트 포스 - 1018번 (0) | 2023.01.13 |
(*풀이진행중)브루트 포스 - 1018번 (1) | 2023.01.12 |
브루트 포스 - 7568번 (0) | 2023.01.12 |
댓글