문제 :
https://programmers.co.kr/learn/courses/30/lessons/42888
1. 문제 이해하기
- 문자열 배열 형태로 각 문자열의 첫 번째 단어는 입장, 퇴장, 변경, 두 번째는 유저 아이디, 세 번째는 닉네임이 저장되어 있습니다.
- 모든 record를 수행하고 나서, 변경이 있다면 변경된 닉네임을 기준으로, 최종적으로 오픈 채팅방에 출력되는 문자열 배열 출력
- record는 1 이상 100,000 이하
- 입출력 예시를 보면 확실히 문제를 이해할 수 있습니다.
2. 문제 풀이 생각하기
- 입력이 최대 100,000가 주어질 수 있으므로 100,000의 제곱만큼의 시간이 걸리면 안 될 것이라는 생각을 했습니다.
- 그래서 무조건 해시 자료구조를 사용해야겠다고 생각했습니다. -> [유저 아이디 : 닉네임]
- 그리고 모든 record를 한 번 확인하면서 유저의 닉네임을 갱신하고, 갱신된 닉네임으로 다시 한 번 record를 확인하면서 출력 값을 저장해야겠다고 생각했습니다.
- 처음 record를 확인할 때는 Enter와 Change일 때 해당 유저 아이디에 해당하는 닉네임을 갱신하고, 그 이외의 경우는 넘어갑니다.
- 두 번째로 record를 확인할 때는 갱신된 닉네임을 기준으로 Enter 일 때는 입장, Leave일 때는 퇴장 문자열을 ans에 저장합니다.
3. 차근차근 구현하기
import Foundation
func solution(_ record:[String]) -> [String] {
var ans = [String]()
var ht = [String : String]() // [유저 아이디 : 닉네임]
for str in record {
let line = str.split(separator: " ").map{String($0)}
// Enter, Change 일 때만 닉네임을 갱신하므로 그 외의 경우는 넘어가기
if line[0] != "Enter" && line[0] != "Change" {
continue
}
ht[line[1]] = line[2] // 닉네임 갱신
}
for str in record {
let line = str.split(separator: " ").map{String($0)}
if line[0] == "Enter" {
ans.append("\(ht[line[1]]!)님이 들어왔습니다.")
continue
}
if line[0] == "Leave" {
ans.append("\(ht[line[1]]!)님이 나갔습니다.")
continue
}
}
return ans
}
4. 피드백
- Swift의 문자열 처리는 역시 Python보다 더 어려운 것 같습니다. 숙련도를 더 올려보도록 하겠습니다.
'Algorithm > Swift' 카테고리의 다른 글
[Programmer] 짝지어 제거하기 (Swift) (0) | 2021.07.16 |
---|---|
[백준 1806] 부분합 (Swift) (0) | 2021.07.15 |
[Programmers] 행렬 테두리 회전하기 (Swift) (0) | 2021.07.10 |
[Programmers] 로또의 최고 순위와 최저 순위 (Swift) (0) | 2021.07.10 |
[백준 16931] 겉넓이 구하기 (Swift) (0) | 2021.07.06 |