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)
}
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] 무인도 여행 (Swift) (0) | 2025.06.02 |
---|---|
[프로그래머스] 주사위 고르기 (Swift) (0) | 2025.06.01 |
[프로그래머스] 서버 증설 횟수 (Swift) (0) | 2025.05.09 |
[프로그래머스] 땅따먹기 (Swift) (0) | 2025.04.24 |
[프로그래머스] 숫자 타자 대회 (Swift) (0) | 2025.04.23 |