본문 바로가기
알고리즘 문제풀이

[프로그래머스] 봉인된 주문 (Swift)

by SiO2whocode 2025. 5. 31.

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

 

프로그래머스

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

programmers.co.kr

 

문제

최대 11글자로 이루어진, 주문이 있음. 이 주문은 a부터 시작해서 길이 순서 & 알파벳 순서대로 배치됨

근데 봉인된 주문이 배열로 주어짐, 이 봉인된 주문을 제외하고 n번째 주문이 무엇인지 알아내는 문제

 

 

접근방법

1. 문자열을 순서(숫자)로 변환하는 함수 만들기 (26진법 활용) - 숫자는 1부터 시작 (a = 1)

2. 순서(숫자)를 문자열로 변환하는 함수 만들기 (26진법 활용) 

- 여기서 n-1로 다루는 이유는 숫자를 26으로 나눈 나머지를 활용할 거라 97(a)가 base라면 나머지 값이 0~25가 나와야함.

근데 문제에선 1이 a고, 26이 z인 설정. -> 따라서, 1->0(a) 26->25(z)로 해줘야 97에 더했을 때 맞는 문자가 나옴

그럼, 왜 96을 base로 설정하면 되지 않냐! 하면 -> 이 경우 나머지 값이 1~26이 나와야 하는데 그러면 26으로 나누고 1을 더해줘야함 그거나 그거나 임 -> 사실 아직 이렇게 해서 되는 경우를 테스트 못해봄

3. 봉인된 주문의 순서 구하기, 배열에 담고 순서대로 정렬하기

4. 정렬된 봉인된 주문들의 순서를 순회하면서 n번째 앞 주문인 경우 n을 1 증가시키기 (없어진 주문 만큼 뒤로 n의 순서를 뒤로 미룸)

- 꼭 순차적으로 미루어야됨. 예) 봉인된 주문: 1,6번째, 최초 n: 5번 인경우, n을 고정한채로 n보다 작거나 같은 봉인된 주문만 없애면 안됨. 1이 없어지면서 n이 6번째가 되고, 6번째 주문도 봉인됐기 때문에 최종적으로 n은 7번째 주문임. 이걸 반영할 수 있어야 해서, 순차적으로 n을 미뤄야됨

5. 4번의 결과로 나온 n을 문자열로 바꾸기

 

돌고돌아 젤 깔끔한 코드로 마무리..힘들었다..

감사합니당.. https://haleylog.tistory.com/18

 

 

소스코드

import Foundation

func numToString(_ n:Int) -> String {
    var _n = n
    var str = ""
    
    while _n > 0 {
        str = String(Character(UnicodeScalar((_n-1) % 26 + 97)!)) + str
        _n =  (_n-1) / 26
    }
    
    return str
}

func stringToNum(_ str: String) -> Int {
    var n = 0
    for c in str {
        n = n * 26 + Int(c.unicodeScalars.first!.value) - 96
    }
    return n
}

func solution(_ n:Int64, _ bans:[String]) -> String {

    var _n:Int = Int(n)
    
    var banNums:[Int] = bans.map{ stringToNum($0) }.sorted()
    
    for ban in banNums {
        if ban <= _n {
            _n += 1
        }
    }
    
    return numToString(_n)
    
}
728x90