프로그래머스 Lv2. 오픈채팅방 (Java / Python)

eora21·2022년 8월 31일
0

프로그래머스

목록 보기
5/38

문제 링크

문제 간단 해석

유저가 들어오고, 닉네임을 변경하고, 나가는 과정을 기록한 후 id에 맞게 닉네임을 매칭해주면 된다.

Java

간단한 클래스를 이용하였다.

풀이 코드

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으로 답을 제출.

Python

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.

profile
나누며 타오르는 프로그래머, 타프입니다.

0개의 댓글