코드짜는 노인네

[프로그래머스] 로또의 최고순위와 최저순위 - 문제해결과정 본문

코딩 테스트

[프로그래머스] 로또의 최고순위와 최저순위 - 문제해결과정

ikohong 2022. 8. 28. 09:21
728x90
반응형

[프로그래머스] 로또의 최고순위와 최저순위 - 문제해결과정


문제 : 지워진 로또번호를 예측하여 최고순위와 최저순위를 맞춰라
EX>
로또 번호 (지워진 숫자는 0으로 표시) : [44, 1, 0, 0, 31, 25]
로또 당첨 번호 : [31, 10, 45, 1, 6, 19]
최고, 최저 등수 : [3, 5]

나의 문제 해결 과정 (에러과정)


일단 문제를 딱 보았을때 '0'이라는 숫자를 어떻게 해야될까 고민을 했다. '0'이라는 숫자를 로또 당첨번호중 맞는 번호 혹은 맞지 않는 번호를 넣어서 로또 당첨번호와 비교를 해 등수를 맞출려고 시도를 했습니다.

# 당첨된 로또 번호 이외의 로또 번호를 리스트에 생성
not_lottos_num_all = list(range(1,47))
for a in win_nums:
    not_lottos_num_all.remove(a)

일단 로또 번호를 List(리스트)로 만들었습니다. 로또 번호는 '1~46'사이임으로 해당 번호들을 다 포함 시킨 다음, 당첨된 번호를 제거해 당첨이 안된 번호를 모았습니다.

# 최대 등수, 최저 등수를 확인하기 위한 리스트 생성
max_lottos = []
min_lottos = []

for i in lottos:
    max_lottos.append(i)
    min_lottos.append(i)

그 다음으로는 최고 등수, 최저 등수를 확인하기 위한 List(리스트)를 생성했습니다. 아직은 구분을 할 수 없기에, 사용자가 작성한 로또 번호 정보가 들어있는 'lottos'를 'max_lottos','min_lottos'에 포함을 시켰습니다.

# 사용자가 작성한 번호중 당첨번호가 있다면, 해당 번호를 지우기 위한 pop_win_nums 리스트 작성
pop_win_nums = []

for i in win_nums:
	pop_win_nums.append(i)

for a in win_nums:
    if a in lottos:
        pop_win_nums.remove(a)

다음으로는 'pop_win_nums'라는 List(리스트)를 생성해, 당첨된 번호를 추가를 한 뒤에, 사용자가 작성한 로또 번호중 당첨번호가 있다면 제거를 해서 사용자가 작성하지 않은 당첨번호 리스트를 만들어주었습니다.

# 로또 번호를 최대로 맞출 경우
for i in range(0,6):
    if max_lottos[i] == 0:
        for j in pop_win_nums:
            for z in max_lottos:
                if z not in pop_win_nums:
                    max_lottos[i] = j
                    pop_win_nums.remove(j)
                    break
            break

그리고 사용자가 로또번호를 최대로 맞출경우를 만들었습니다. 로또 숫자는 6개가 포함되어있으므로 리스트 index(인덱스)'0~5'사이에 있는 값들중 지워진 숫자 '0'이 있다면, 해당 공간에 당첨된 숫자중 사용자가 적은 로또 정보와 중복되지 않는 숫자를 넣은 다음, 해당 숫자를 제거해, 또 다른 '0'이 있는 공간에 중복되게 숫자가 들어가지 않도록 코드를 작성하였습니다.

# 로또 번호를 최소로 맞출 경우
for i in range(0,6):
    if min_lottos[i] == 0:
        not_num = random.choice(not_lottos_num_all)
        min_lottos[i] = not_num
        not_lottos_num_all.remove(not_num)

다음으로는 로또번호를 최소로 맞출경우를 만들었습니다. 아까 만들어놓았던 'not_lottos_num_all'에 당첨되지 않는 숫자중 임의의 숫자를 지워진 숫자 '0'에 포함을 시킨 다음, 포함시킨 숫자를 'not_lottos_num_all'에서 제거를 시켜주었습니다.

# 로또 번호를 맞춘 갯수를 파악하여 최종 등수를 answer로 반환

lottos_max_result = 7
lottos_min_result = 7

for i in max_lottos:
    if i in win_nums:
        lottos_max_result -= 1
if lottos_max_result == 7:
    lottos_max_result = 6
        
for i in min_lottos:
    if i in win_nums:
        lottos_min_result -= 1
if lottos_min_result == 7:
    lottos_min_result = 6
    
answer = [lottos_max_result, lottos_min_result]

마지막으로 당첨된 로또 번호랑 비교를해서 몇개를 맞췄는지 비교를 한 다음에, 맞춘 갯수에 따라 '-1'씩 적용을 하여 최종 등수를 확인 할 수 있도록 코드를 짰습니다. 단, 하나도 못맞췄을경우에는 '7'등이 없기 때문에 '6'등으로 숫자를 변경해주었습니다.


최종 코드 결과물


import random

lottos = [44, 1, 0, 0, 31, 25]
win_nums = [31, 10, 45, 1, 6, 19]
pop_win_nums = []

not_lottos_num_all = list(range(1,47))
for a in win_nums:
    not_lottos_num_all.remove(a)

for i in win_nums:
    pop_win_nums.append(i)

max_lottos = []
min_lottos = []

for i in lottos:
    max_lottos.append(i)
    min_lottos.append(i)

for a in win_nums:
    if a in lottos:
        pop_win_nums.remove(a)

# 로또 번호 최대로 맞출 경우
for i in range(0,6):
    if max_lottos[i] == 0:
        for j in pop_win_nums:
            for z in max_lottos:
                if z not in pop_win_nums:
                    max_lottos[i] = j
                    pop_win_nums.remove(j)
                    break
            break  

# 로또 번호 최소로 맞출 경우
for i in range(0,6):
    if min_lottos[i] == 0:
        not_num = random.choice(not_lottos_num_all)
        min_lottos[i] = not_num
        not_lottos_num_all.remove(not_num)

lottos_max_result = 7
lottos_min_result = 7

for i in max_lottos:
    if i in win_nums:
        lottos_max_result -= 1
if lottos_max_result == 7:
    lottos_max_result = 6
        
for i in min_lottos:
    if i in win_nums:
        lottos_min_result -= 1
if lottos_min_result == 7:
    lottos_min_result = 6
    
answer = [lottos_max_result, lottos_min_result]

코드를 완성하고, 테스트를 통과했지만, 나중에 보니, 굳이 이렇게 하지 않고 짧게 코드를 작성해도 되는 문제였네요. 다른분들이 풀은 문제를 확인해보니, 간단한 문제였습니다. 여기서 다루지는 않겠지만, 한번 다른 방식으로 코드를 작성해서 문제를 풀어본 다음, 다른분들을 풀이도 확인해보세요~

728x90
반응형
Comments