오늘은 백준 1436번 문제인 ‘영화감독 숌’ 문제를 풀었다.
문제 자체는 간단하지만 처음엔 로직이 어떻게 돌아가는지 감이 잘 안 왔었다.
천천히 디버깅하면서 흐름을 이해하고, while문이 어떻게 작동하는지 하나하나 따라가 보면서 완전히 감을 잡았다.

https://www.acmicpc.net/problem/1436
숫자를 하나씩 올려가면서 '666'이 포함된 수를 찾는 문제다.
예를 들어 666, 1666, 2666, 3666처럼, 숫자 안에 666이라는 문자열이 들어가기만 하면 조건을 만족한다.
N번째로 작은 그런 수를 찾는 게 문제의 핵심이다.
숫자 666부터 시작해서 하나씩 증가시킨다.
각 숫자를 문자열로 바꿔 "666"이 포함되어 있는지 확인한다.
포함되어 있다면 카운트를 증가시킨다.
카운트가 입력한 N과 같아지면 그 숫자를 출력하고 종료한다.
using System;
class Program
{
static void Main()
{
int n = int.Parse(Console.ReadLine());
int count = 0;
int number = 666;
while (true)
{
if (number.ToString().Contains("666"))
{
count++;
if (count == n)
{
Console.WriteLine(number);
break;
}
}
number++;
}
}
}
처음엔 이 while(true) 루프가 도대체 언제 끝나는지, 내부 조건이 어떻게 동작하는지 좀 막막했다.
하지만 곰곰이 따라가보니 흐름은 단순했다.
number를 666부터 시작해서 하나씩 증가시킨다.
.ToString().Contains("666")를 통해 현재 숫자에 666이 들어있는지 확인한다.
들어있으면 count++
count == N이면 해당 숫자를 출력하고 종료한다.
예를 들어 N = 3이면,
→ 666, 1666, 2666 → 정답은 2666
처음엔 숫자를 다 검사하는 게 너무 비효율적인 것 같았는데,
사실 C#에서 문자열 검사 속도가 빨라서 500번째 정도까지도 충분히 빠르게 계산된다.
그리고 무엇보다 중요한 건 로직을 직접 따라가면서 흐름을 눈으로 확인하는 게 훨씬 큰 도움이 됐다.
문자열 검사 .Contains()는 간단하지만 매우 유용하다.
while (true) 루프를 쓸 때는 언제 break 되는지를 명확히 정리해두면 훨씬 이해가 쉽다.
디버깅용 출력으로 Console.WriteLine(count + ": " + number); 를 넣어보면 흐름이 눈에 훨씬 잘 들어온다.