본문 바로가기
알고리즘 문제

카카오 코딩테스트 - 오픈 채팅방

by 박연호의 개발 블로그 2019. 8. 24.

http://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 난이도 순으로 풀 수 있도록 차례대

tech.kakao.com

확실이 뭔가 내가 그동안 백준에서 풀던 알고리즘과는 좀 다르다는 느낌을 받았다. 문제 설명이 생각보다 긴데, 핵심을 그렇게 어렵지 않은 것 같다. 아무래도 1번 문제여서 그런듯

 

문제를 보자마자 1분 고민하다가....이거 map쓰면 되잖아? 생각이 들었다. 배열을 써도 풀릴 것 같긴한데 난 map을 좋아한다.

 

해결 방법은,

1. (사용자 아이디, 닉네임)으로 map을 만들고, status가 "Enter","Change"면 닉네임을 수정해준다.

2. 동시에, "Enter"이거나 "Leave"인 경우만 text를 출력해야 하기 때문에 size++를 해주고, 그 만큼 return 되는 배열의 크기를 만들었다.

3. for문을 한번 더 돌면서, status가 "Enter"이거나 "Leave"인 경우는 map의 key값을 사용하여 text를 만들어 주었다.

 

// https://www.welcomekakao.com/learn/courses/30/lessons/42888?language=java

import java.util.*;

class Solution {
    public String[] solution(String[] record) {

        String[] answer = {};
        Map<String, String> map = new HashMap<String, String>();
        int i;

        String status = "", userId = "", nick = "";
        int size = 0;

        for (i = 0; i < record.length; i++) {
            String[] arr = record[i].split(" ");
            if (arr.length == 3) {
                status = arr[0];
                userId = arr[1];
                nick = arr[2];
            } else {
                status = arr[0];
                userId = arr[1];
            }

            if (status.equals("Enter") || status.equals("Leave")) {
                size++;
            }
            if (status.equals("Enter") || status.equals("Change")) {
                map.put(userId, nick);
            }

        }

        answer = new String[size];

        int index = 0;

        for (i = 0; i < record.length; i++) {
            String[] arr = record[i].split(" ");
            status = arr[0];
            userId = arr[1];

            String text;
            if (status.equals("Enter")) {
                text = map.get(userId) + "님이 들어왔습니다.";
                answer[index++] = text;
            } else if (status.equals("Leave")) {
                text = map.get(userId) + "님이 나갔습니다.";
                answer[index++] = text;
            }
        }
        return answer;
    }
}