알고리즘 풀이/프로그래머스

[Level 1] 실패율

mhko411 2021. 8. 3. 00:23
728x90

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

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr


첫 번째 접근

각 stage마다 해당 stage에 있는 사람의 수를 분자, stage 이상인 사람을 분모로 하여 해당 값을 stage 번호와 함께 리스트에 추가한다. 이후 리스트에서 실패율을 기준으로 내림차순 정렬하고 최종적으로 첫 번째 값부터 탐색해서 stage를 출력하도록 한다.

 

첫 번째 구현

- stage를 1부터 N까지 진행하여

- stages 리스트를 탐색하여 stage와 같을 때는 x를 증가, stage 이상일 때는 y를 증가한다.

- 이후 (x/y, stage)를 튜플 형태로 리스트에 추가하고

- 해당 리스트를 첫 번째 값을 기준으로 내림차순 정렬한다.

- 최종적으로 리스트에서 값을 꺼내서 stage만 result에 담아서 반환한다.

def solution(N, stages):
    answer = []
    for stage in range(1, N+1):
        x = 0
        y = 0
        for number in stages:
            if number == stage:
                x += 1
            if number >= stage:
                y += 1
        if x == 0 or y == 0:
            answer.append((0, stage))
        else:
            answer.append((x/y, stage))
    answer = sorted(answer, key=lambda x: -x[0])
    result = []
    for x, y in answer:
        result.append(y)
    return result

두 번째 접근

누적합을 활용하였다. 먼저 각 스테이지마다 도달한 사람의 수를 counter리스트에 저장한다. 그리고 acc 리스트에 현재 스테이지 이상으로 클리한 사람의 수를 누적합으로 계산하여 저장한다.

이를 위해서는 0번 인덱스부터가 아닌 가장 끝의 인덱스부터 탐색을 진행하여 계산해야 한다. 즉 [1, 3, 0, 2]가 있을 때 3번 인덱스부터 0번 인덱스까지 탐색을 하여 해당 인덱스의 counter 값과 +1한 인덱스의 acc 값을 더하도록 한다.

 

두 번째 구현

- counter 리스트는 최대 N+1까지의 값이 있기 때문에 N+2만큼 생성하였고

- acc 리스트는 최대 N+1까지 있기 때문에 N+2부터 진행되도록 하기위해 N+3만큼 생성하였다.

- 먼저 stages를 탐색하여 counter 리스트에 각 stage까지 도달한 사람의 수를 측정하고

- 이를 활용하여 acc 리스트에 누적 합의 결과를 저장한다.

- 이제 counter와 acc를 활용하여 counter[i]/acc[i]로 실패율을 측정하도록한다.

- 이후부터는 위의 코드와 동일한 로직이다.

def solution(N, stages):
    answer = []
    counter = [0 for _ in range(N+2)]
    acc = [0 for _ in range(N+3)]
    
    for stage in stages:
        counter[stage] += 1
    
    for i in range(N+1, 0, -1):
        acc[i] = counter[i] + acc[i+1]
    
    temp_list = []
    for i in range(1, N+1):
        if counter[i] == 0 or acc[i] == 0:
            temp_list.append((0, i))
        else:
            temp_list.append((counter[i] / acc[i], i))
    temp_list = sorted(temp_list, key=lambda x: -x[0])
    for a, b in temp_list:
        answer.append(b)
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 프렌즈 4블록  (0) 2021.08.29
[Level 2] 뉴스 클러스터링  (0) 2021.08.29
[Level 1] 키패드 누르기  (0) 2021.07.31
[Level 1] 숫자 문자열과 영단어  (0) 2021.07.31
[Level 2] 괄호 회전하기  (0) 2021.06.15