문제
해석
처음 A ~ Z 까지는 1 ~ 26까지 색인번호가 명시되어 있고
주어진 문자를 하나씩 순회하며 다음글자와의 조합 (w+c) 가 사전에 존재하는 지 여부에 따라 분기가 나눠진다.
만약 존재한다면
- 별도의 출력 없이 현재 문자열이 w+c로 갱신되고
만약 존재하지 않는다면
- 현재 문자열의 색인을 출력
- w+c를 사전에 추가한다
- 또한 현재문자열(w)는 다음 문자열(c)가 된다.
여기서 중요한 점은 나는 w를 문자열의 첫 문자가 아닌 공백("")문자열로 시작했다.
이렇게 해야 인덱스 접근이 보다 편하고 분기가 간편해진다.
코드
import Foundation
extension String {
subscript(_ index: Int) -> String {
return String(self[self.index(self.startIndex, offsetBy: index)])
}
}
func solution(_ msg:String) -> [Int] {
var answer: [Int] = []
var dict: [String: Int] = [:]
var a: Character = "A"
var index: Int = 1
let length = msg.count
// A ~ Z 색인번호 삽입
for i in 0...25 {
let letter = String(Character(UnicodeScalar(65+i)!))
dict[letter] = i+1
}
var w = ""
for index in 0..<length {
let c = msg[index] // 다음 문자열
let wc = w + c
if dict[wc] != nil { // 존재하면 w를 wc로 갱신
w = wc
} else { // 존재하지 않으면
answer.append(dict[w]!) // 현재 입력의 색인 출력
w = c // 다음 글자로 갱신
dict[wc] = dict.count+1 // w+c 사전추가
}
}
answer.append(dict[w]!) // 마지막 현재 값 추가
return answer
}
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 괄호 변환 (0) | 2024.09.17 |
---|---|
[프로그래머스] 문자열 압축 (1) | 2024.09.16 |
[프로그래머스] 오픈채팅방 (1) | 2024.09.16 |
[프로그래머스] n진수 게임 (0) | 2024.09.15 |
[프로그래머스] 파일명 정렬 (0) | 2024.09.15 |