(Swift) 백준 1436 영화감독 숌

SteadySlower·2022년 5월 31일
0

Coding Test

목록 보기
51/305

1436번: 영화감독 숌

// 영화감독 숌

/*
 666
 1666
 2666
 3666
 4666
 5666 👉 여기까지는 규칙이 있는 듯?
 6660 👉 바로 예외가 등장
 6661
 6662
 ...
 💡 몇줄만 적어봐도 규칙은 없다는 것을 알 수 있다.
 💡 그리고 N이 10,000 밖에 안된다 = 전부 다 계산해도 시간 초과 없음
 */

// "666"이 들어가는지 알아보는 함수
    //💡 자릿수에 대한 것은 10의 배수로 나누기!
func checkIf(n: Int) -> Bool {
    var n = n
    while n >= 666 {
        if n % 1000 == 666 {
            //👉 1000으로 나눈 나머지 (= 마지막 3자리)가 666인지 확인
            return true
        }
        n /= 10 //👉 자리수 한 칸 앞으로 당겨서 다시 확인
    }
    return false
}

let N = Int(readLine()!)!

var now = 666 //👉 첫 번째 경우의 수를 알고 있으므로 여기서 부터 반복문
var count = 1

while count != N {
    now += 1
    if checkIf(n: now) {
        count += 1
    }
}

print(now)
  1. 코드 안에 적어놓았지만 마찬가지로 영화제목에 일정한 규칙은 없습니다.
    1. 그리고 N이 10000보다 작으므로 모든 경우의 수를 따져보아도 긴 시간이 걸리지 않습니다.
  2. 666이 들어가는지 확인하는 함수를 만듭니다.
    1. 자릿수를 따질 때는 10의 배수로 나눈 나머지를 적극 활용합시다.
  3. 666에서 1씩 늘려가면서 조건을 만족하는지 반복문을 돌립니다.

참고: String.contains()

이 문제를 풀면서 가장 처음 떠올린 것은 “666”이 들어가는지 어떻게 찾을 것인가였습니다.

String.contains()를 사용하면 위에 사용한 방법보다는 훨씬 더 간단하게 코드를 만들 수 있었습니다.

🚫  다만 해당 메소드를 사용한 경우에 이 문제에서는 시간초과가 나서 사용할 수 없었습니다.

import Foundation
//👉 String.contains(Character)는 Foundation 없이도 사용이 가능하지만
//⭐️ String.contains(StringProtocol)은 Foundation이 있어야 사용이 가능하다!

func checkIf(n: Int) -> Bool {
	return String(n).contains("666")
}
profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글