반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - [3차] 압축" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 문자열 처리와 해시 테이블 문제입니다.
해시 테이블에 문자열 처리를 살짝 첨가한 느낌이에요.
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
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형