본문 바로가기
스파르타코딩 클럽/아이고리즘

Swift | 알고리즘 문제 풀기9 (저주의 숫자3)

by UDDT 2025. 4. 8.

9. 알고리즘 문제 풀기

 문제

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
1 - 1
2 - 2
3 - 4
4 - 5
5 - 7
6 - 8
7 - 10
8 - 11
9 - 14
10 - 16

 

    https://school.programmers.co.kr/learn/courses/30/lessons/120871

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

 풀이

func solution(_ n:Int) -> Int {
    guard 1 <= n && n <= 100 else { return 0 }
    var arrNumber: [Int] = []
    var threeNumbers = [3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53, 63, 73, 83, 93]
    let numberArrange = 1..<100
    for num in numberArrange {
        if !num.isMultiple(of: 3) && !threeNumbers.contains(num) {
            arrNumber.append(num)
        }
    }
    return arrNumber[n - 1]
}

solution(30)

 

  로직을 딱딱 짜내지는 못했지만,

 Sudo 코드 작성 후에 풀 수 있었다.

 

 자신 있게 코드를 프로그래머스에 집어넣었다.

 

 

   역시 나야! 하며 제출 후 채점하기를 눌렀다.

 

 

 

    웨요.....

 

 트러블 슈팅

     이제는 하다하다 프로그래머스에서 오류를 받아내는 나.....

실패 (signal: illegal instruction (core dumped))

 

    이 에러는 범위를 초과할 때 주로 발생하는 에러다.

 

    가만히 코드를 들여다보니 한가지 에러가 있었다.

    n의 범위가 100까지일 뿐이지, n에 100을 입력하면 100을 초과한 숫자가 나와야 한다.

 

     문제를 다시 한번 보자

3x 마을 사람들은 3을 저주의 숫자라고 생각하기 때문에 3의 배수와 숫자 3을 사용하지 않습니다. 3x 마을 사람들의 숫자는 다음과 같습니다.
1 - 1
2 - 2
3 - 4
4 - 5
5 - 7
6 - 8
7 - 10
8 - 11
9 - 14
10 - 16
...
52 - 95
53 - 97
54 - 98
...

 

   따라서 이 오류는 정확한 오류였다.

  튜터님 중 한 분은 이렇게 말씀하셨다. "컴퓨터는 거짓말을 하지 않아요"

 

   문제를 해결하기 위해 범위를 늘려주었다.

func solution(_ n:Int) -> Int {
    guard 1 <= n && n <= 100 else { return 0 }
    var arrNumber: [Int] = []
    var threeNumbers = [3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53, 63, 73, 83, 93]
    let numberArrange = 1..<150
    for num in numberArrange {
        if !num.isMultiple(of: 3) && !threeNumbers.contains(num) {
            arrNumber.append(num)
        }
    }
    return arrNumber[n - 1]
}

 

 범위를 초과하였다는 동일한 에러가 나왔다.

150으로는 택도 없다.

 

 범위를 200까지 늘리고 빌드를 하니 3이 포함된 숫자가 나왔다.

 

  왜 그런지 생각해보다가, 위의 노가다했던 에러처리가 생각났다.

 

func solution(_ n:Int) -> Int {
    guard 1 <= n && n <= 100 else { return 0 }
    var arrNumber: [Int] = []
    // 내일은 밑에 노가다를 개선해볼게요....
    var threeNumbers = [3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53, 63, 73, 83, 93, 103, 113, 123, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 143, 153, 163, 173, 183, 193]
    let numberArrange = 1..<200
    for num in numberArrange {
        if !num.isMultiple(of: 3) && !threeNumbers.contains(num) {
            arrNumber.append(num)
        }
    }
//    numberArrange.forEach { num in
//        if !num.isMultiple(of: 3) && !threeNumbers.contains(num) {
//            arrNumber.append(num)
//        }
//    }
    return arrNumber[n - 1]
}

 

  코드를 다음과 같이 바꾸고나서 빌드를 하니 이상 없이 실행되었다.

 내일은 이 코드를 개선해볼 예정이다.

var threeNumbers = [3, 13, 23, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 43, 53, 63, 73, 83, 93, 103, 113, 123, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 143, 153, 163, 173, 183, 193]

 

최근댓글

최근글

skin by © 2024 ttuttak