일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- unity engine
- blender
- c#
- vrm posing desktop
- 배열 리스트
- 라자냐
- 마인크래프트
- 잴다의 전설 티어스 오브 더 킹덤
- 카니발대학교 공대강국
- 코딩테스트
- 스택
- 빅오 표기법
- 택시 기하학
- VPS
- 그리디 알고리즘
- 우선순위 큐
- 그래픽 디자인
- T자형 인재
- 자료구조
- 브루트포스 알고리즘
- 닌텐도 스위치 2
- 영어
- 큐
- windows 12
- 2025 대한민국 채용박람회
- 다이나믹프로그래밍
- i자형 인재
- 이진 탐색
- 시작
- VRoid Studio
- Today
- Total
WalkerJei's Lifelog
백준알고리즘 1436번 영화감독 숌 C# 본문
세부 정보
- 사이트: 백준알고리즘
- 번호: 1436
- 문제명: 영화감독 숌
- 언어: C#
- 분류: 브루트포스 알고리즘
- 비고:
문제
666은 종말을 나타내는 수라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타워즈를 만들 때, 스타워즈 1, 스타워즈 2, 스타워즈 3, 스타워즈 4, 스타워즈 5, 스타워즈 6과 같이 이름을 지었고, 피터 잭슨은 반지의 제왕을 만들 때, 반지의 제왕 1, 반지의 제왕 2, 반지의 제왕 3과 같이 영화 제목을 지었다. 하지만 숌은 자신이 조지 루카스와 피터 잭슨을 뛰어넘는다는 것을 보여주기 위해서 영화 제목을 좀 다르게 만들기로 했다.
종말의 수란 어떤 수에 6이 적어도 3개 이상 연속으로 들어가는 수를 말한다. 제일 작은 종말의 수는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 이다. 따라서, 숌은 첫 번째 영화의 제목은 "세상의 종말 666", 두 번째 영화의 제목은 "세상의 종말 1666"와 같이 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 수) 와 같다.
숌이 만든 N번째 영화의 제목에 들어간 수를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.
입력
첫째 줄에 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.
풀이
Substring(j, 3)은 다음과 같이 해석할 수 있다.
문자열의 j번째 위치부터 3개의 문자를 묶어서 검사한다.
class Title666
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
// 영화의 시리즈 번호 입력
int n = Convert.ToInt32(sr.ReadLine());
// 영화 제목에 들어갈 수
int titleNum = 0;
// 1씩 증가하는 수
int i = 0;
// 배열에 값이 들어가야 1씩 증가하는 수
int k = 0;
// 이전에 상영한 영화 제목에 들어간 수
int temp = 0;
while (k < n)
{
// 영화 제목에 들어간 수를 문자열로 바꾸고 3개 단위씩 검사
for(int j = Convert.ToString(i).Length - 3; j >= 0; j--)
{
// 영화 제목에 666이 들어가고, 이전 상영 영화 제목에 들어간 수와 그 다음 영화 제목에 들어간 수가 같지 않아야 한다.
if (Convert.ToString(i).Substring(j, 3) == "666" && temp != i)
{
// 영화 제목 갱신
titleNum = i;
k++;
}
// 이전 상영한 영화 제목에 들어간 수를 저장
temp = titleNum;
}
i++;
}
// 영화 제목에 들어갈 수를 출력
sw.WriteLine(titleNum);
sr.Close();
sw.Close();
}
}
후기
이 문제 역시 처음 보는 사람이라면 당황할 문제일 수 있다. 또한 기껏 풀어도 초 단위로 주어지는 연산 시간을 초과할까봐 걱정해 본 문제이기도 한다. 브루트포스 알고리즘이 모든 가능한 경우의 수를 대입해서 답을 찾아나가는 방식이다 보니 연산 시간만 넉넉하면 문제 해결이 가능하다. 연산 시간은 컴퓨터가 작업을 처리하는 데 걸리는 시간, 제한 시간은 테스트 응시자가 소스 코드를 작성할 수 있는 시간을 의미한다는 것은 다들 알고 있을 것이다. 이번에는 자력으로 문제를 풀어보는 데 성공했다!
푸는 과정에서 배열에 값을 저장하다가 오류가 나기도 했고 한 개의 수를 666이 들어갔다는 이유만으로 순서를 공유하는 문제도 있었는데 번뜩이는 해결책을 찾아서 정답을 맞추는 데 성공했다!
'소프트웨어 개발 > 코딩테스트(기성 문제)' 카테고리의 다른 글
백준알고리즘 10845번 큐 C# (0) | 2025.05.12 |
---|---|
백준알고리즘 2720번 세탁소 사장 동혁 C# (1) | 2025.05.11 |
백준알고리즘 10825번 국영수 C# (0) | 2025.05.09 |
백준알고리즘 10987번 모음의 개수 C# (0) | 2025.05.07 |
백준알고리즘 31403번 A + B - C C# (0) | 2025.05.07 |