[PS] 2019 카카오 신입 공채 1차 코딩 테스트 (01, 02)

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

1. 오픈채팅방

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42888

접근했던 방법

record 에서 유저 아이디별로 닉네임 정보를 확인할 수 있기 때문에 record 를 읽으면서 Enter 혹은 Change를 확인할 경우 유저의 정보를 업데이트 하면 된다고 생각했습니다. 정보 저장은 dict 를 사용했습니다. 사소한 실수만 하지 않는 다면 간단한 문제입니다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def solution(record):
    answer = []

    history = {}
    for message in record:
        # 배열의 모든 원소의 split(" ") 후 개수가 3개 아닌 것에 유의!!
        # Leave 메세지는 split(" ") 결과가 2개임
        info = message.split(" ")

        state = info[0]

        if state == "Enter" or state == "Change":
            history[info[1]] = info[2]

    for message in record:
        info = message.split(" ")
        state = info[0]
        user_id = info[1]

        if state == "Enter":
            answer.append(history[user_id] + "님이 들어왔습니다.")
        elif state == "Leave":
            answer.append(history[user_id] + "님이 나갔습니다.")
        else:
            continue
    return answer
  1. Leave 메세지는 신경 쓰지 않습니다.
  2. record 의 원소를 split 할 때 state, userid, name = message.split(" ") 와 같이 명시하면 Leave 일 경우 에러가 납니다.
  3. histotry 에 유저 아이디와 닉네임 업데이트 사항을 기록합니다.
  4. 최종 업데이트 사항에 맞춰 해당되는 메세지를 출력합니다.

2. 실패율

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42889

접근했던 방법

2번 문제도 문제에서 요구하는 사항을 그대로 코드로 옮기면 되는 간단한 문제입니다. 다만 stages 에는 [1, N] 가 모두 포함되어 있지 않기 때문에 이 부분 (즉, 실패율이 0이 되는 부분)만 신경 쓰면 됩니다. 실패율을 구할 때는 해당 스테이지에 도달한 플레이어의 수를 구해야 하는데, 이는 해당 스테이지 이상에 해당하는 원소의 개수를 세면 됩니다. 다만 이 때 조건문으로 매번 원소의 개수를 구하는 건 비효율적이라 생각했고, 1번 문제와 마찬가지로 dict 를 사용했습니다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from collections import defaultdict


def solution(N, stages):
    info = defaultdict(int)
    for stage in stages:
        info[stage] += 1

    res = {}
    num_users = sum(info.values())
    for n in range(1, N + 1):
        if n in info:
            failure_rate = info[n] / num_users
            res[n] = failure_rate

            num_users -= info[n]
        else:
            res[n] = 0

    sorted_res = sorted(res.items(), key=lambda x: x[1], reverse=True)
    return [key for key, value in sorted_res]
  1. 먼저 stages 를 순회하면서 각 스테이지별로 몇 명의 플레이어가 머물러 있는 지 세 줍니다. 이 때 collection.defaultdict 를 사용하면 손쉽게 처리할 수 있습니다.
  2. 다음으로는 range(1, N + 1) 을 순회하면서 실패율을 계산해주었습니다. 이 때 총 플레이어 수를 미리 구해 놓은 다음 (num_users) 실패율을 구할 때마다 해당 스테이지에 머물러 있는 플레이어의 수는 빼 주었습니다. 이러면 다음 실패율을 구할 때는 해당 스테이지 이상에 도달한 플레이어의 수만 남게 됩니다. range(1, N + 1) 을 순회하면서 ninfo 에 있으면 실패율을 구해주고 플레이어의 수를 차감합니다. 그렇지 않을 경우 실패율은 0으로 처리해줍니다.
  3. 마지막으로 실패율 dict 를 내림차순으로 정렬해주고, 키만 해답으로 리턴합니다.