본문 바로가기

알고리즘

프로그래머스 - 오픈채팅방

 

https://programmers.co.kr/learn/courses/30/lessons/42888

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

오픈채팅방 문제를 풀었습니다.

아무래도 이 문제의 키 포인트는 hashmap을 바로 떠올리냐라고 생각을 하고 처음에는 문제를 헤매었는데 아마 저처럼 헤매시는 분들도 많을 것 같아서 틀린 소스와 정답 소스를 같이 올려서 비교해보겠습니다.

처음에 짠 틀린 코드

해시맵을 사용하려고 한 생각은 맞았지만 hashmap의 id와 nickname을 저장하는 과정을 한 번에 진행하려다 보니까 문제가 꼬였습니다. 이 풀이처럼 하게 되면 해시 맵의 nickname이 시도 때도 없이 변경되어서 틀리게 됩니다.

class Solution {
        public String[] solution(String[] record) {
            String temp = "";
            String userId = "";
            String nickName ="";
            int idx = 0;
            HashMap<String, String> hashMap = new HashMap<>(); // Key : ID, Value : Nickname
            int count =0;
            for(String num : record){
                temp = num.split(" ")[0];
                if(!temp.equals("Change")){
                    count++;
                }
            }
            String[] answer = new String[count];

            for(String recordSplit: record){
                temp = recordSplit.split(" ")[0];
                userId = recordSplit.split(" ")[1];
                if(!temp.equals("Leave")){
                    nickName = recordSplit.split(" ")[2];
                }
                if(temp.equals("Enter")){
                    answer[idx] = userId + "님이 들어왔습니다.";

                } else if(temp.equals("Leave")){
                    answer[idx] = userId + "님이 나갔습니다.";
                } else{
                    idx--;
                }

                if(temp.equals("Enter") || temp.equals("Change")){
                    hashMap.put(userId, nickName); // 저장 완료, 계속실행되면 안되넴..
                }
                idx++;
            }

            for(int sIdx =0; sIdx<answer.length; sIdx++){
                for(String key : hashMap.keySet()){
                    answer[sIdx] = answer[sIdx].replace(key,hashMap.get(key));
                }
            }

            for(String a: answer){
                System.out.println(a);
            }

            return answer;
        }
    }

 

정답 소스

해시맵에 값이 이상하게 들어가는 것을 보고 해시 맵을 먼저 만들자라는 생각을 했습니다.

그리고 해시맵을 만든 후에 풀이를 진행하니 위에 풀이처럼 id랑 nickname을 바꾸는 프로세스도 필요 없어졌기 때문에 훨씬 더 간략한 풀이를 만들 수 있었고, 모든 테스트 케이스를 통과할 수 있었습니다.

class Solution {
        public String[] solution(String[] record) {
            HashMap<String, String> map = new HashMap<>();
            int count=0; int idx=0;

            for(int i=0; i<record.length; i++){  // key, value 값 만들기
                String[] recordSplit = record[i].split(" ");
                if(!recordSplit[0].equals("Leave")){
                    map.put(recordSplit[1], recordSplit[2]);
                }

                if(!recordSplit[0].equals("Change")){
                    count++;
                }
            }

            String[] answer = new String[count]; // answer 생성

            for(int j=0; j<record.length; j++){
                String[] recordSplit = record[j].split(" ");
                if(recordSplit[0].equals("Enter")){
                    answer[idx] = map.get(recordSplit[1])+"님이 들어왔습니다.";
                    idx++;
                } else if(recordSplit[0].equals("Leave")){
                    answer[idx] = map.get(recordSplit[1])+"님이 나갔습니다.";
                    idx++;
                }
            }

            return answer;
        }
    }

 

혹시 틀린점이나 궁금한 점이 있으시면 댓글 남겨주세요.