코딩테스트/프로그래머스

[Java] 프로그래머스 Level 2 : 오픈채팅방

이덩우 2023. 6. 30. 11:47

- 문제설명

 

- 예시

 

- 해결과정

  • 닉네임이 변경되는 상황은 나갔다 들어오는 경우 or 직접 닉네임을 바꾸는 경우, 총 두 가지다.
  • 문제에서 원하는 답은, 닉네임 변경사항을 끝까지 추적해서 최종 닉네임을 포함한 문장을 출력하라는 문제이다.
  • 첫 번째로 <고유Id, 닉네임> 형식의 HashMap을 생성해, 닉네임의 변동이 생길 때마다 업데이트 해줬다.
  • 정답으로 내보내야 하는 것은 오픈채팅방에 들어올 때, 나갈 때만 어떤 사람이었는지 알려주면된다.
  • 닉네임 변경사항은 표시안해줘도 된다.
  • 따라서 리스트에 [출입상태, 고유Id] 형식으로 출입 명령이 들어올 때마다 기록해줬다.
  • 이후 정답에서 원하는 형식에 따라 문장을 출력해주면 되는데, 리스트에 있는 고유Id를 key값으로 해시맵을 통해 최종 닉네임을 얻어와서 정답을 반환해주면 된다.

 

- 솔루션

import java.util.*;
class Solution {
    public String[] solution(String[] record) {
        HashMap<String, String> memberTable = new HashMap<>();
        ArrayList<String[]> accessList = new ArrayList<>();
        
        for(String a : record) changeRecord(a, memberTable, accessList);
        String[] answer = new String[accessList.size()];
        makeAnswer(answer, memberTable, accessList);
        
        return answer;
    }
    
    private void changeRecord(String record, HashMap<String, String> memberTable, ArrayList<String[]> accessList) {
        String[] input = record.split(" ");
            
        if(input[0].equals("Enter")) {
            memberTable.put(input[1], input[2]);
            accessList.add(new String[]{"Enter", input[1]});
        }
        if(input[0].equals("Leave")) {
        accessList.add(new String[]{"Leave", input[1]});
        }
        if(input[0].equals("Change")) {
        memberTable.put(input[1], input[2]);
        }
    }
    
    private void makeAnswer(String[] answer, HashMap<String, String> memberTable, ArrayList<String[]> accessList) {
        for(int i = 0; i < accessList.size(); i++) {
            if(accessList.get(i)[0].equals("Enter")) {
                answer[i] = memberTable.get(accessList.get(i)[1]) + "님이 들어왔습니다."; 
            }
            if(accessList.get(i)[0].equals("Leave")) {
                answer[i] = memberTable.get(accessList.get(i)[1]) + "님이 나갔습니다.";
            }
        }    
    }
}

 

- 정리

  • 카카오 문제 재밌다!