- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

Level 1 문제이고, 스스로 푼 문제다!

 

문제에서 헷갈렸던 게, 3진법 진행 순서와 배열의 진행 순서가 반대라는 것이다. 

배열에서는 가장 왼쪽이 0 인덱스지만, 3진법에서는 가장 오른쪽에 있는 수는 3 ** 0 을 곱해야하기 때문이다

 

1. 

몇 번까지 진행해야하는지 모르니까 while문으로 n을 나눌 수 있는 가장 큰 3의 제곱수를 찾은 다음 

거꾸로 for문을 진행하면서 n의 3진법을 three 리스트에 구현한다 

 

2. 

three 배열을 거꾸로 진행하면서 flipped 배열에 추가한다 (.sort(reverse = True) 는 1200 을 0021이 아닌 2100으로 바꿔서 안된다)

 

3. 

flipped의 원소들 또한 거꾸로 진행하면서 3의 제곱수를 곱해서 다 더한 값을 answer로 반환한다 

 

일일이 순서대로 진행했는데, 뭔가 큐나 스택의 특성을 이용하면 더 빨리 풀 수 있을 것 같다 

 

- 정답 풀이 :

def solution(n):
    answer = 0 
    mul= 0 
    while True:
        if n // (3 ** mul) == 0:
            mul -= 1 
            break
        mul += 1
    three = []
    
    for i in range(mul, -1 , -1):
        num = n // (3 ** i)
        three.append(num)
        # 제곱수의 몫까지 곱해서 빼주기 
        n -= (3 ** i) * num
        
    flipped = []
    for i in range(len(three) - 1, -1, -1):
        flipped.append(three[i])
    
    for i in range(len(three) - 1, -1, -1) :
        answer += flipped[i] * (3 ** (len(three) -1 - i))
    
    return answer

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42576

 

Level1 문제고, 스스로 푼 문제다!

 

participant 중에 마라톤을 완료하지 못한 한 명을 찾아 이름을 반환해야한다 

 

1.

not in completion으로 풀 수도 있지만, 동명이인인 경우에 participant에 동명이인이 있고, 그 중 한명이 completion에 없다면 complete하지 못했는데 complete했다고 여겨질 수 있다 

 

2. 

그래서 이름에 해당하는 사람 수를 딕셔너리에 저장한 후 completion에서 이름이 있을 때마다 값을 -= 1 하는 방식으로 진행한 다음 

 

3.

통과하지 못한 사람은 마지막에 키 값이 1일 것이므로 해당 키를 반환하면 된다 

 

- 정답 풀이 :

def solution(participant, completion):
    result = {}
    answer = ''
    
    for name in participant : 
        if name not in result:
            result[name] = 1
        else:
            result[name] += 1
            
    for name in completion : 
        if name in result:
            if result[name] != 0 :
                result[name] -= 1
                
    for name in result:
        if result[name] != 0 :
            answer += name
            
    return answer

 

- 다른 풀이 :

Counter 모듈을 이용해서 각 리스트의 차이를 구해 정답을 찾는 풀이다 

from collections import Counter

def solution(participant, completion):
    result = Counter(participant) - Counter(completion)
    return list(result.keys())[0]

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42889

 

Level 1 문제이고, 스스로 푼 문제다!

 

stages의 각 인덱스는 사용자의 번호이고, 각 값은 각 유저가 있는 스테이지 번호다 

stage[i] 값은 i 유저가 있는 스테이지이고, 이를 아직 깨지 못한 상태다. 따라서 i 는 stage[i] 단계에서 실패한 유저에 속한다 

각 단계에 대해 전체 유저를 완전탐색으로 돌면서 각 단계에서 실패한 유저 수를 구한다음 해당 스테이지에서 성공한 유저들의 수로 나눈다. 이 값을 fail 해당 단계 값에 추가한다 

 

처음에는 fail을 리스트로 구현하려고 했지만 실패율로 내림차순 정리하고, 인덱스를 출력해야하므로 해당 실패율에 대응하는 값도 필요해서 딕셔너리로 구현했다 

 

주의할 점

실패율 자체가 소수이기 때문에, ' // ' 연산을 사용하면 다 0으로 나와서 틀린다

그렇기 때문에 ' / ' 연산을 이용하고, onStage == 0 일 때는 런타임 에러가 발생하므로, onStage != 0 일 때에만 진행한다 

 

딕셔너리의 value로 정렬하는 법 공부하기 

sorted_value = sorted(fail.items(), key = lambda x : x[1], reverse = True)

#print(sorted_value)
[(4, 1.0), (1, 0.0), (2, 0.0), (3, 0.0)]

 

- 정답 풀이 :

def solution(N, stages):
    answer = []
    #해당 스테이지에 있는 유저 수 
    onStage = len(stages)
    fail = {}
    
    for i in range(1, N + 1):
        fail[i] = 0 
    
    for i in range(1, N + 1):
        count = 0 
        for j in range(len(stages)):
            #i 스테이지 못 깬 사람 수 구하기 
            if stages[j] == i:
                count += 1
        #이거 추가해야 런타임 에러 발생하지 않는다 
        if onStage != 0:                
            fail[i] += (count / onStage)
            onStage -= count
        
    sorted_value = sorted(fail.items(), key = lambda x : x[1], reverse = True)
    
    for i in sorted_value:
        answer.append(i[0])
        
    return answer

- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/42840

 

Level1 이고, 스스로 푼 문제다!

1,2,3번 수포자가 있고 이들이 수학 모의고사에서 답을 찍는 패턴을 one, two, three 리스트에 저장한 다음에 

각 리스트 별로 몇 문제를 맞혔는지 socre()함수로 진행하고 final 리스트 각 원소에 누적한다 

final은 전역 변수로 score() 함수에서도 사용할 수 있게 했다

 

가장 많은 문제를 맞힌 사람을 answer에 추가하는 건데 

처음에는 한 문제 이상 맞힌 사람을 넣다보니 틀렸었다 

주어진 조건대로 다시 작성하니 정답이 떴다 (언제나 그렇듯이 문제를 꼼꼼히 읽자 제발!!)

 

 - 정답 풀이 :

def score(arr, answers, x):
    i = 0
    for ans in answers:
        if i == len(arr):
            i = 0
        if ans == arr[i]:
            final[x] += 1
        i += 1
        
final = [0,0,0]                        
def solution(answers):
    answer = []
    global final
    one = [1,2,3,4,5]
    two = [2,1,2,3,2,4,2,5]
    three = [3,3,1,1,2,2,4,4,5,5]
    
    score(one, answers, 0)
    score(two, answers, 1)
    score(three, answers, 2)
               
    for i in range(1,4):
        if final[i - 1] == max(final):
            answer.append(i)
    answer.sort()
    
    return answer

 

+ Recent posts