본문 바로가기

Study/알고리즘

[2019 카카오 신입 공채 1차 코딩 테스트] 2. 실패율 - python

처음에 접근한 방법은 stages를 정렬한 뒤에 visit라는 배열에 해당 스테이지에 방문한 사람의 수를 저장하고 passCnt에는 해당 스테이지를 통과한 사람의 수를 저장했다.


visit는 stage를 역순으로 정렬한 뒤에 아래 코드이 반복문을 사용하여 초기화를 해주었고, passCnt도 초기화 해준 뒤 실패율이 아닌 스테이지 성공률을 buffer 리스트에 튜플형태로 저장하였다. 그리고 이를 정렬하여 answer에 저장하는 방법을 사용했는데, 채점결과 70점대로 통과하였다.


이를 개선하여 passCnt 없이 성공률을 계산하였는데 이는 visit를 모두 채워넣었을때 i번 스테이지 성공률 = visit[i+1] / visit[i] 이기 때문이다.


하지만 이를 적용해도 채점결과가 변하지 않았다. 아래는 해당 코드이다.


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
27
28
29
30
31
32
33
34
35
36
37
38
def solution(N, stages):
 
    answer = []
 
    N = 5
    stages = [21262433]
 
    visit = [int(0for _ in range(N + 1)]

    buffer = []
 
    stages.sort()
    stages.reverse()
 
    for i in stages:
        if visit[i] == 0:
           visit[i] = max(visit[i:]) + 1
        else:
            visit[i] += 1
 
    tmp = 0
 
    for i in reversed(range(N)):
        if visit[i+1== 0:
            visit[i+1= tmp
        else:
            tmp = visit[i+1]
 
    for i in range(N):
        rate = visit[i+1/ visit[i]
        buffer.append((rate, i + 1))
 
    buffer.sort(key=lambda element: element[0])
 
    for i in buffer:
        answer.append(i[1])
 
    return answer
cs


개선 방향을 계속해서 고민해 보았지만 괜찮은 아이디어가 떠오르지 않아서 결국 구글링을 통해 pass한 코드를 찾아냈다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
def solution(N, stages):
    buffer = {}
    total = len(stages)
 
    for i in range(1, N + 1):
        if total != 0:
            cnt = stages.count(i)
            buffer[i] = cnt / total
            total -= cnt
        else:
            buffer[i] = 0
 
    answer = sorted(buffer, key=lambda x: buffer[x], reverse=True)
    return answer
cs


우선 이전의 코드에서 스테이지와 실패율을 저장한 buffer 리스트를 위의 코드에서는 딕셔너리로 선언 한 뒤에, 방문자 수를 저장하는 배열을 사용하지 않고 전체 참가자의 수를 저장한 total과 stages를 1부터 마지막 스테이지 까지 오름차순으로 순환하면서 해당 스테이지에 멈춰있는 사람의 수를 이용하여 실패율을 계산했다.