안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - [3차] 압축" 문제를 풀었습니다.
Github
GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘
스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.
github.com
문제 링크
코딩테스트 연습 - [3차] 압축
TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]
programmers.co.kr
풀이
이번 문제는 문자열 처리와 해시 테이블 문제입니다.
해시 테이블에 문자열 처리를 살짝 첨가한 느낌이에요.
1. 알파벳 Dictionary를 만듭니다.
알파벳 문자열을 이용해 Dictionary로 만들었습니다.
let alphabets: String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var dict: [String: Int] = [:]
for (i, ch) in alphabets.enumerated() {
dict[String(ch)] = i+1
}
2. count 변수가 문자열 범위 내인 동안 반복합니다.
이번 문제는 다음 글자와 현재 글자가 겹치는 경우가 있기 때문에 for in 문이 아닌 while 문을 사용했습니다.
자세한 건 아래에 있습니다.
3. count 변수를 이용해 현재 입력과 다음 글자를 구합니다.
msg는 사전에 String을 [String]으로 변환하였습니다.
str은 ""로 초기화 된 String 변수입니다.
msg[count]와 지금까지 나온 글자를 이은 str을 이용합니다.
let ch = msg[count] //다음 글자
var tmpString = str + ch //현재 입력
4. 해시 테이블에 등록된 단어인지 확인합니다.
옵셔널 바인딩을 이용해 확인하였습니다.
tmpString을 Dictionary의 키로 이용하여 nil 이면 없는 단어입니다.
단어가 없으면 Dictionary에 등록합니다.
이어서 result에 str을 넣습니다.
str + ch의 키가 존재 하지 않은 것이므로 str은 키가 항상 존재합니다.
단어가 존재하면 str에 ch를 덧붙이고 count를 증가시켜 탐색을 진행합니다.
감사합니다!
전체 코드
func solution(_ msg:String) -> [Int] {
var result: [Int] = []
let alphabets: String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var dict: [String: Int] = [:]
for (i, ch) in alphabets.enumerated() {
dict[String(ch)] = i+1
}
var msg: [String] = Array(msg).map { String($0) }
var count = 0
var str: String = ""
while count < msg.count {
let ch = msg[count] //다음 글자
var tmpString = str + ch //현재 입력
guard let _ = dict[tmpString] else { //존재하지 않으면 사전 추가
dict[tmpString] = dict.count+1
result.append(dict[str]!) //출력
str = ""
continue
}
//존재하면 계속 탐색
str += ch
count += 1
}
result.append(dict[str]!) //출력
return result
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.