Algorithm
[프로그래머스] 오픈채팅방
쑤야.
2024. 1. 10. 13:18
https://school.programmers.co.kr/learn/courses/30/lessons/42888
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
접근
- 아이디에 대해서 최신 닉네임 값을 저장해야 한다 → 딕셔너리
로직
- key를 아이디로, value에 닉네임을 저장할 수 있는 딕셔너리를 선언한다
- 닉네임 매핑을 최신값으로 해야 하므로, 입/퇴장 기록을 아이디와 함께 저장한 후 닉네임 점검이 모두 마무리된 이후 매핑 과정을 거쳐 결과값을 변환한다
- record에 대해 반복문을 수행한다
- Enter나 Leave인 경우, 튜플 타입 (입장여부, 아이디)으로 데이터를 추가한다
(→ 파이썬의 경우, 튜플이 아닌 배열을 사용하는 것이 더 편리하다) - Enter와 Change 케이스인 경우, 현재 닉네임과 동일 여부를 신경쓰지 않고, 갱신한다
- Enter나 Leave인 경우, 튜플 타입 (입장여부, 아이디)으로 데이터를 추가한다
- 입/퇴장 데이터에 대해 map 연산자를 통해 닉네임을 매핑하여 결과값으로 반환한다
코드
1. Swift 풀이
func solution(_ record:[String]) -> [String] {
var user = [String:String]() //id : nickname
var log = [(id: String, isEnter: Bool)]()
for r in record {
let split = r.split(separator: " ").map{ String($0) }
switch split[0] {
case "Enter":
user[split[1]] = split[2]
log.append((split[1], true))
case "Leave":
log.append((split[1], false))
case "Change":
user[split[1]] = split[2]
default: break
}
}
return log.map{
let explain = $0.isEnter ? "님이 들어왔습니다." : "님이 나갔습니다."
return user[$0.id]! + explain
}
}
2. Python 풀이
def solution(record):
user = {}
log = []
for r in record:
split = r.split(" ")
if split[0] == "Enter":
user[split[1]] = split[2]
log.append([0, split[1]])
elif split[0] == "Leave":
log.append([1, split[1]])
else:
user[split[1]] = split[2]
def mapNickname(data):
explain = "들어왔습니다." if data[0] == 0 else "나갔습니다."
return user[data[1]] + "님이 " + explain
return list(map(mapNickname, log))