유저가 들어오고, 닉네임을 변경하고, 나가는 과정을 기록한 후 id에 맞게 닉네임을 매칭해주면 된다.
간단한 클래스를 이용하였다.
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
class log {
private String id;
private String act;
public log(String id, String act) {
this.id = id;
this.act = act;
}
public String getId() {
return id;
}
public String getAct() {
return act;
}
}
public String[] solution(String[] record) {
Map<String, String> users = new HashMap<>();
List<log> result = new ArrayList<>();
String[] message;
for (String rec: record) {
message = rec.split(" ");
switch (message[0]) {
case "Enter":
result.add(new log(message[1], "님이 들어왔습니다."));
case "Change":
users.put(message[1], message[2]);
break;
case "Leave":
result.add(new log(message[1], "님이 나갔습니다."));
break;
default:
break;
}
}
String[] answer = new String[result.size()];
for (int i=0; i < result.size(); i++) {
answer[i] = users.get(result.get(i).getId()) + result.get(i).getAct();
}
return answer;
}
}
class log {
private String id;
private String act;
public log(String id, String act) {
this.id = id;
this.act = act;
}
public String getId() {
return id;
}
public String getAct() {
return act;
}
}
log 클래스, 유저의 id와 행동으로 나뉜다.
Map<String, String> users = new HashMap<>();
List<log> result = new ArrayList<>();
String[] message;
user의 id와 닉네임을 정리할 Map, 로그를 모아둘 List, 유저 기록을 분할할 String 배열을 선언했다.
for (String rec: record) {
message = rec.split(" ");
switch (message[0]) {
case "Enter":
result.add(new log(message[1], "님이 들어왔습니다."));
case "Change":
users.put(message[1], message[2]);
break;
case "Leave":
result.add(new log(message[1], "님이 나갔습니다."));
break;
default:
break;
}
}
record에서 하나씩 읽어오며 분할한다. 첫 번째 내용에 따라 case를 수행한다.
Enter
일 경우, log를 만들어 result에 넣는다. break가 없기 때문에, Change
에 정의한 내용까지 수행한다.
Change
일 경우, 유저의 id와 닉네임을 최신화한다.
Leave
일 경우 역시 log를 남긴다.
String[] answer = new String[result.size()];
for (int i=0; i < result.size(); i++) {
answer[i] = users.get(result.get(i).getId()) + result.get(i).getAct();
}
return answer;
result의 크기만큼 String 배열을 만든다. 그 후 배열을 돌며 result에 접근해 id와 act를 가져오고, id로 현재 닉네임을 구해온 후 닉네임과 act를 붙여 저장한다.
return으로 답을 제출.
switch case가 없기 때문에, dict와 함수의 결합으로 문제를 해결했다.
def solution(record):
def Enter(uid, nickname):
user[uid] = nickname
log.append(uid + "님이 들어왔습니다.")
def Leave(uid):
log.append(uid + "님이 나갔습니다.")
def Change(uid, nickname):
user[uid] = nickname
log = []
user = {}
acts = {"Enter": Enter, "Leave": Leave, "Change": Change}
for rec in record:
rec = rec.split()
acts[rec[0]](*rec[1:])
for i in range(len(log)):
uid = log[i].split("님")[0]
log[i] = log[i].replace(uid, user[uid])
return log
def Enter(uid, nickname):
user[uid] = nickname
log.append(uid + "님이 들어왔습니다.")
def Leave(uid):
log.append(uid + "님이 나갔습니다.")
def Change(uid, nickname):
user[uid] = nickname
명령에 따라 동작할 함수들을 정의했다.
log = []
user = {}
acts = {"Enter": Enter, "Leave": Leave, "Change": Change}
유저들의 log를 담을 list, 유저의 id와 닉네임을 담을 dict, 함수를 매칭시킬 dict를 선언했다.
for rec in record:
rec = rec.split()
acts[rec[0]](*rec[1:])
record에서 하나씩 가져와 공백을 기준으로 분리하고, 첫 단어에 따라 어떤 함수를 돌릴 지 결정한다.
해당 함수에 인자를 넣어주는데, Enter
, Change
일 경우는 2개, Leave
일 경우에는 1개이다. 케이스마다 분할해서 넣어주기 귀찮으니 *
를 써서 unpack했다.
for i in range(len(log)):
uid = log[i].split("님")[0]
log[i] = log[i].replace(uid, user[uid])
return log
log를 돌리며 id를 구한다(이럴거면 구분해서 넣는 방법이 더 좋았을 것 같다). 해당 id를 닉네임으로 변환시킨다.
그 후 log를 return.