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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr


문제 해결을 위한 과정

이 문제의 경우 그다지 어렵지 않은 문제였고 파이썬의 내장 함수인 count를 이용하여 쉽게 해결을 할 수 있었습니다. 

for문을 이용해서 단계의 사람의 수를 구하고 리스트에 튜플의 형태로 (단계의 사람 수 /전체 사람 수, 전체 사람 수) 추가합니다. 그 후 전체 사람 수에서 단계의 사람 수를 빼줌으로써 다음 단계에서는 이전 단계에서의 사람의 수를 제외시켜 줍니다. 이렇게 리스트에 추가를 해 준 후 문제에서의 조건처럼 다음과 같이 정렬해줍니다. 

 

1. 실패율의 내림차순대로

2.. 실패율이 같으면 스테이지의 번호를 오름차순으로 


문제 해결을 위한 팁

이 문제의 경우 테스트 케이스중에 만약 5단계라면 3단계에서 모두 실패하고 4단계, 5단계에 도달하지 못하는 경우가 있습니다. 따라서 count를 이용하여 해당 단계에 도전하는 사람이 없는 경우 분모가 0인 divide by zero가 발생하지 않도록 실패율을 0으로 해당 리스트에 추가해줍니다.


소스코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def solution(N, stages):
    user = len(stages)
    result = []
    ans = []
    for i in range(1, N+1):
        people = stages.count(i)
        if people == 0:
            result.append((0, i))
            continue
        fail = people / user
        result.append((fail, i))
        user -= people
    result.sort(key = lambda x: (-x[0], x[1]))
    for i in range(N):
        a, b = result[i]
        ans.append(b)
    return ans
 
= 5
stages = [12213]
print(solution(N, stages))
cs

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

프로그래머스 의상(Python)  (0) 2024.04.06
신고 결과 받기(Python)  (0) 2022.02.20
가사 검색 (Python)  (0) 2020.12.17
블록 이동하기 (Python)  (0) 2020.12.07
괄호 변환 (Python)  (0) 2020.12.05

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

 

코딩테스트 연습 - 가사 검색

 

programmers.co.kr


문제 해결을 위한 과정

이 문제의 경우 이진 탐색을 이용하여 푸는 문제라는 것을 알 수만 있다면 쉽게 해결할 수 있는 문제였습니다. 가장 먼저 문제의 조건을 보면 "?" 즉 와일드 문자가 들어갈 수 있는 곳은 접두사 즉 맨 앞, 혹은 접미사 즉 맨 뒤에만 존재할 수 있다고 합니다. 이 조건이 키포인트입니다.

 

1. 먼저 10001행을 가진 리스트 array와 10001행 리스트를 가진 리스트 reverse_array를 생성합니다. 그 후 words 리스트를 조회하면서 각 원소의 글자 수에 맞는 행에 array와 reverse_array에 삽입해 줍니다.

ex) frodo의 경우 5글자 이므로 array[5].append(frodo), reverse_array[5].append(frodo)를 수행해 줍니다. 

 

2. 1의 과정을 완료한 후 queries리스트를 조회하면서 원소가 ?로 시작하지 않으면 array의 해당 행에서 몇 개와 매치될수 있는지 찾고 그 값을 answer리스트에 append 해준다. 반대로 ?로 시작하면 해당 쿼리를 뒤집은 후 reverse_array의 해당 행에서 몇개와 매치될 수 있는지 찾는다. (단 이때 찾는 함수는 https://bgspro.tistory.com/27?category=981927 에서 소개한 count_by_range 함수를 이용하고 left_index와 right는 각각 "?"를 a로 치환한, 'z'로 치환한 값으로 설정한다.)

ex) 만약 fro?? 인 경우 ?로 시작하지 않고 5글자 이므로 array[5]에서 count_by_range(array, query.replace('?', 'a'), query.replace('?', 'b')를 수행한다. 

 

3. 위의 과정을 완료한 후 answer리스트를 return 한다.


문제 해결을 위한 팁

리스트를 손쉽게 역순으로 바꿀 수 있는 방법이 있습니다. 바로 인덱싱을 이용하는 방법인데 예시는 다음과 같습니다.

array = [1, 2, 3, 4, 5]의 경우 array [::-1]을 하게 되면 [5, 4, 3, 2, 1]로 바꿀 수 있습니다.]


소스코드

answer.append(ans)</div><div

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
from bisect import bisect_left, bisect_right
 
def count_by_range(a, left_value, right_value):
    left_index = bisect_left(a, left_value)
    right_index = bisect_right(a, right_value)
    return right_index - left_index
 
def solution(words, queries):
    answer = []
    array = [[] for _ in range(10001)]
    reverse_array = [[] for _ in range(10001)]
    
    for word in words:
        array[len(word)].append(word)
        reverse_array[len(word)].append(word[::-1])
        
    for i in range(10001):
        array[i].sort()
        reverse_array[i].sort()
        
    for i in queries:
        if i[0!= "?":
            ans = count_by_range(array[len(i)], i.replace('?''a'), i.replace('?','z'))
        else:
            ans = count_by_range(reverse_array[len(i)], i[::-1].replace('?','a'), i[::-1].replace('?','z'))
        answer.append(ans)
    return answer
cs

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

신고 결과 받기(Python)  (0) 2022.02.20
실패율 (Python)  (0) 2021.01.11
블록 이동하기 (Python)  (0) 2020.12.07
괄호 변환 (Python)  (0) 2020.12.05
자물쇠와 열쇠 (Python)  (0) 2020.12.03

+ Recent posts