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을 반환하는 식으로
마무리해주었다.