Data Analyst KIM

[Coding Club] 2023.06.15 - 프로그래머스Lv.1 문제 풀이(명예의 전당(1), 로또) 본문

일상/Coding Club

[Coding Club] 2023.06.15 - 프로그래머스Lv.1 문제 풀이(명예의 전당(1), 로또)

김두연 2023. 6. 15. 12:21
반응형

활동 : Coding Club

일시 : 2023.06.15

내용 : 프로그래머스Lv.1 문제 풀이

문제 : 명예의 전당(1), 로또

다음주 과제 : 신규아이디 추천 , 크기가 작은 부분 문자열

 

몰입해서 설명중인 나

문제1. 명예의 전당(1)

명예의 전당(1)

<내코드>

나는 문제를 접근할 때 명예의 전당 k개 만큼까지는 마지막 인덱스를 리스트에 저장하고,

k개 이후부터는 k개의 인덱스-1 의 값을 리스트에 저장하는 방법을 생각해서 구현을 했다.

def solution(k, score):
    kl = []
    result = []
    for i in score :
        kl.append(i)                 # 인덱스의 값을 kl에 저장
        kl = sorted(kl,reverse=True) # 내림차순 정렬
        if len(kl) <= k :            # kl의 길이가 k보다 작거나 같으면
            result.append(kl[-1])    # 마지막 인덱스의 값(가장 작은 값)을 result에 저장 
        else :                       # kl의 길이가 k보다 크다면
            result.append(kl[k-1])   # kl의 k-1번째 인덱스의 값을 result에 저장
    return result

 

<다른사람 코드>

오름차순으로 정렬을 하는 것이 아닌 리스트에 저장되는 데이터의 값을 줄이기 위해서 if문을 활용하여 비교 후 필요없는 데이터는 제거하여 최솟값을 활용하여 문제를 해결했다.

def solution(k, score):
    result = []
    answer = []
    for i in score:
        result.append(i)            # 일단 추가
        if len(result) > k:         # 명예의 전당에
            result.remove(i)        # 자리가 넘어버리면 제거 이후 조건에 맞게 추가
            if (i >= min(result)) & (i != min(result)): # i != min(result)는 없어도 되지만 불필요한 반복을 없애기 위해 사용
                result.remove(min(result))   # 며예의 전당 안에 있는 최소값이 i 보다 작으면 제거
                result.append(i)             # 없어진 점수 보다 크기때문에 추가
        answer.append(min(result))
    return answer

 

다른 사람의 코드를 보고 리스트의 변수를 모두 넣어서 인덱스 값을 출력하는 것이 아닌
조건문을 활용하여 리스트에 저장되는 변수를 제어하여 문제를 해결할 수 있다는 것을 알게 되었다.

문제2. 로또의 최고 순위와 최저 순위

로또의 최고 순위와 최저 순위

 

<내코드>

0이 아닌 값을 저장할 공간과 순위를 부여할 변수를 만들었다. 로또가 당첨번호와 인덱스 별로 비교를 해서 똑같은 번호가 있으면 answer에 저장을 했다. answer의 길이 별로 순위를 나누었다. 

0이 있는 경우를 plus라는 변수에 저장을 했다. 그리고 0인 경우를 생각해보면 모두 0인경우와 0이 없는 경우, 나머지 경우라고 생각해서 3가지의 경우로 나누어서 코드를 작성했다.

먼저 모두 0인 경우에는 set()과 len()를 이용해서 [1,6]을 반환하고, 0이 없는 경우에는 [result,result]를 반환하도록 만들었다. 나머지의 경우에는 [result-plus,result]로 반환을 하게 했다.

만약 2개를 맞춰서 6등인데 0이 2개 포함이 되어있으면 [6-2,6]=[4,6]

def solution(lottos, win_nums):
    answer = []                   # 0이 아닌 값을 저장할 공간
    result = 0                    # 순위를 부여하기 위해 만듬
    for i in lottos :
        for v in win_nums :
            if i == v :
                answer.append(i)  # 0이 아닌 값을 answer에 저장 
    if len(answer) ==  0 :        # answer에 길이에 따라
        result = 6                # 순위 부여 
    elif len(answer) == 1 :
        result = 6 
    elif len(answer) == 2 :
        result = 5
    elif len(answer) == 3 :
        result = 4
    elif len(answer) == 4 :
        result = 3
    elif len(answer) == 5 :
        result = 2
    elif len(answer) == 6 :
        result = 1 

    plus = lottos.count(0)            # lottos의 0의 개수
    if len(set(lottos)) == 1 :        # lottos가 모두 같으면 
        return [result-plus+1,result] # [1,6]을 반환
    else :
        if plus == 0 :                # 0의 개수가 없다면
            return [result,result]    # [1,1]처럼 반환 => 0이 없으면 [1,2]와 같은 경우가 생기지 않음
        else :                        
            return [result-plus,result] # 0이 1,2,3,4,5개인 경우에는 [result-plus,result]사용

 

<다른사람 코드>

n은 번호 일치의 수, zero는 0의 개수, answer은 결과를 저장할 방이다.

max = n+zero , min = n 을 활용하여 최고 순위와 최저 순위의 번호를 만들었다.

def solution(lottos, win_nums):
    n = 0
    zero = 0
    answer = []
    for i in range(0,6):
        if lottos[i] in win_nums:  # 몇 개의 번호가 일치하는가
            n += 1
        if lottos[i] == 0:         # 알아볼 수 없는 숫자가 몇 개인가
            zero += 1
    max = n + zero # 최고 순위 번호 일치 개수
    min = n # 최저 순위 번호 일치 개수
    for i in [max,min]:
        num = i
        # 순위 결정
        if num == 6:
            rank = 1
        elif num == 5:
            rank = 2
        elif num == 4:
            rank = 3
        elif num == 3:
            rank = 4
        elif num == 2:
            rank = 5
        else:
            rank = 6
        answer.append(rank)
    return answer

 

나는 문제를 따라서 0을 기준으로 3가지의 경우를 나누어서 생각해서 출력의 조건문을 3가지를 사용하여 구현했지만, 다른 사람의 코드를 보고 min과 max를 잘 정의하면 출력값에서 if문을 사용하지 않고도 구현할 수 있음을 느꼈다.
내 코드보다 조금 더 깔끔한 코드인 것 같아서 배울점이 있었다.

 

반응형