혼자 놀기의 달인

Ssoony의 Velog·2024년 6월 28일
0

https://school.programmers.co.kr/learn/courses/30/lessons/131130

import random
def solution(cards):
    countList=[] #상자를 열어본 횟수를 체크
    cardList=[] #상자를 열어 확인한 카드들의 집합
    countNum=0   
    while sorted(cards) != sorted(cardList): #모든 상자를 확인하면 종료
        nextCard=random.randint(1,max(cards)) #랜덤 수를 선택
        while cards[nextCard-1] not in cardList: #선택된 숫자가 아직 열어보지 않은 숫자이면,
            cardList.append(cards[nextCard-1]) #열어보고 숫자를 카드리스트에 추가
            nextCard=cards[nextCard-1]
            countNum+=1 #열어본 횟수 체크
        if countNum!=0: #선택된 숫자가 이미 열어본 상자라면 체크하지 않는다
            countList.append(countNum)
            countNum=0
    countList.sort(reverse=True)
    if len(countList)>=2:
        return countList[0]*countList[1] #열어본 횟수 중 가장 큰 두 수의 곱이 정답!
    else:
        return 0  

문제를 문제 그대로 풀이했다.

풀이과정에서 가장 어려웠던 점이라면, 케이스 2번이 계속 해결되지 않아서 고민했는데,

그 과정에서 생각하지 못했던 케이스가

[2,3,4,5,6,7,8,9,10,1]과 같이 한번에 10개의 상자를 모두 열게되는 경우였다.

이런 경우, 카운터가 한번에 10개가 찍히고, 이후에 상자를 열수 없기 때문에 카운터가 찍히지않는다.

따라서 countList가 [10]과 같이 하나의 원소만을 가지기때문에 답을 계산해낼 수 없다.

따라서 이런 경우를 생각해서 마지막에 len(countList)가 2보다 작을 경우 0을 반환하는 식으로

마무리해주었다.

profile
개발자로 성장하기 위한 한걸음

0개의 댓글