전공/coding test

프로그래머스 2 - 더 좋은 코드란. 기본은 틀리지 말자.

import ysy 2022. 3. 30. 13:55

오늘도 가장 쉬운 코딩테스트 문제를 하나 풀어봤다.
문제: 프로그래머스 - (추가예정)
난이도: Level 1

오늘도 기초적인 것에서 막혔다^^
능숙한 프로그래머가 되는 건 아직 멀었다ㅠㅠ

num_match, num_zero = 0

로 정의 하니까 아래와 같은 에러가 떴다.

cannot unpack non-iterable int object


이를 해결하기 위해서는

num_match = num_zero = 0

이렇게 ,가 아니라 =을 써주거나

num_match = 0
num_zero = 0

이렇게 나누어 주면 해결할 수 있다.

그리고 코드를 다 짰는데

def solution(lottos, win_nums):
    num_match = num_zero = 0 
    for i in lottos:
        if(i==0):
            num_zero += 1
        for j in win_nums:
            if(i==j):
                num_match += 1

    answer = [min(6, 7 - num_match - num_zero), min(6, 7 - num_match)]
    return answer


결과를 보니 zero인 경우가 제대로 구해지지 않은 것 같았다.
알고보니 lottos와 win_nums 두 배열을 헷갈린 것이었다.
문제에 아래처럼 주어졌었는데 간과한 것이다.

민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다.


아무튼 두 배열을 바꿔주어 코드를 완성했다.

그러고 나서 다른 사람이 짠 코드를 보니 아래와 같았다.

def solution(lottos, win_nums):

    rank=[6,6,5,4,3,2,1]

    cnt_0 = lottos.count(0)
    ans = 0
    for x in win_nums:
        if x in lottos:
            ans += 1
    return rank[cnt_0 + ans],rank[ans]


rank array를 선언하여 1개만 맞춘 경우를 고려하지 않는다는 특징을 반영해주었다.
rack가 한눈에 보여서 내 코드보다 가독성이 좋아보였다.
또 나는 if문도 많이 쓰고 for문을 이중으로 썼는데 이 답안은 lottos.count(0)을 이용해 같은 값을 세련되게 구했다는 점에서 배울만한 것 같다.

또, 문제에

당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.


라고 적혀있었는데
배열을 새로 만든 게 아니라 원소 두 개를 선택하여 반환한 점도 인상깊었다.

나는 내 코드도 투박하게 멋지다고 생각하지만 실력의 차이가 느껴지긴 했다.
그래서 lottos.count(0) 부분을 반영하여 내 코드를 더 멋지게 아래와 같이 수정해보았다.

def solution(lottos, win_nums):
    num_match = 0 
    num_zero = lottos.count(0)
    
    for i in win_nums:
        if i in lottos:
            num_match += 1
            
    answer = [min(6, 7 - num_match - num_zero), min(6, 7 - num_match)]
    return answer
반응형