TIL/Coding Test

[프로그래머스] 오픈채팅방

반응형

오늘의 문제. 카카오 2019 블라인드 채용 문제로 나온 문제인가보다. 30분엔 어림도 없지.. 60분 꽉 채워서 풀었다. 어쨌든 풀어서 기분은 좋음.

 

코딩테스트 연습 - 오픈채팅방

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오

programmers.co.kr

import java.util.HashMap;
import java.util.Map;

public class cote0324_chatroom {
    /*
        ~ 의식의 흐름 ~
        유저아이디에 따라서 마지막 닉네임을 해당 닉네임으로 저장
        Enter, Leave는 각각 들어왔습니다, 나갔습니다.
        Change는 로그만 남고 리턴값에 포함되지 않음. 

        record를 쪼개서 새 배열을 만들자. 행위/아이디/닉네임

        ~~~~~

        배열을 만들고서는?
        아이디에 대한 닉네임을 해시맵으로 저장해볼까?

        그리고 다시 for문 돌려서 리턴 스트링을 만들어 넣기
        
    */
    public String[] solution(String[] record) {
        
        int recordSize=record.length;
        String[] doing=new String[recordSize];
        String[] userid=new String[recordSize];
        String[] nickname=new String[recordSize];
        Map<String, String> userMap=new HashMap<>();
        int ansCnt=0;

        //일단 레코드를 쪼개서 저장해준다. 해시맵에는 아이디(key)별 닉네임(value)를 저장해준다.
        for(int i=0; i<recordSize; i++){
            doing[i]=record[i].substring(0, record[i].indexOf(" "));

            if(doing[i].equals("Leave")){ //leave
                userid[i]=record[i].substring(record[i].indexOf(" ")+1);
                nickname[i]="none";
            }else{
                userid[i]=record[i].substring(record[i].indexOf(" ")+1, record[i].lastIndexOf(" "));
                nickname[i]=record[i].substring(record[i].lastIndexOf(" ")+1);
                userMap.put(userid[i], nickname[i]);
            }

          //  System.out.println("doing[i]="+doing[i]);
          //  System.out.println("userid[i]="+userid[i]);
          //  System.out.println("nickname[i]="+nickname[i]);

            userMap.put(userid[i], nickname[i]);
            //ansCnt개수만큼 리턴 스트링배열을 만들어야 하니까 따로 세준다
            if(!doing[i].equals("Change")){
                ansCnt++;
            }
        }

       // System.out.println(userMap);

        String[] answer = new String[ansCnt];
        int ansidx=0; //i랑은 별도로 지정해줘야 한다. Change면 늘어나지 않아야 하기 때문

        for(int i=0; i<recordSize; i++){
            String sentence="";
            //Change면 continue, 아니면 작업 시작
            if(doing[i].equals("Change")){
                continue;
            }else if(doing[i].equals("Enter")){
                sentence=userMap.get(userid[i])+"님이 들어왔습니다.";
            }else if(doing[i].equals("Leave")){
                sentence=userMap.get(userid[i])+"님이 나갔습니다.";
            }
            answer[ansidx]=sentence;
            ansidx++;
        }
        return answer;
    }
}

 

함정에 빠진 곳이 두 군데 있었다.

  • 레코드를 쪼개서 저장해줄 때 userid별 nickname을 저장할 때, Leave인 경우엔 닉네임이 없으므로 거기선 저장해주면 안 되는데 나는 무조건 저장해주고 있었고
  • 마지막에 ansidx없이 continue에서 i--; 를 넣어 돌렸더니 무한루프에 갇혀서 실행시간 초과로 전부 실패했다.

코드를 좀 더 간결하게 고칠 수 있을 거 같은데... 실제론 문제 풀기에 급급한 것 같다. 

728x90
반응형

'TIL > Coding Test' 카테고리의 다른 글

[LeetCode] Lemonade Change (Python)  (0) 2021.03.29
[백준] 베스트셀러 Best Seller  (0) 2021.03.29
[프로그래머스] 카펫  (0) 2021.03.23
[프로그래머스] 주식가격  (0) 2021.03.22
[LeetCode] Majority Element  (0) 2021.03.20