https://school.programmers.co.kr/learn/courses/30/lessons/131130
❓ 문제
프로그래머스 Lv.2 문제 > 혼자 놀기의 달인
❗ 해결
https://www.acmicpc.net/problem/2346
백준 풍선 터뜨리기랑 비슷한 느낌의 문제였다.
다행히 카드 길이가 100장 이하길래 아 완전탐색으로 풀어도 되겠구나..싶었음..
설명은 주석으로 달았다.
def solution(cards):
# 이미 열어본 상자인지 확인
opened = [False] * len(cards)
group = []
# 카드 배열을 순회하면서
for index, value in enumerate(cards):
# 카운트 변수를 0으로 초기화 해준다.
cnt = 0
while True:
# 만약에 순회하다가 이미 연 상자를 만났으면(순회가 끝났으면)
# 카드 그룹에 카드 개수를 append해주고 반복문을 빠져 나온다.
if opened[index]:
group.append(cnt)
break
# 열지 않은 상자라면
# 열었다는 표시 (opened[index]를 True로 바꿔준다.)
# 그리고 index를 상자안에 담긴 카드 숫자로 변경한다.
# 카드값을 갱신해주고, 카드 카운트 수를 1 증가시킨다.
if not opened[index]:
opened[index] = True
index = value - 1
value = cards[index]
cnt += 1
# 그룹을 정렬 해준다.
group.sort(reverse=True)
# 만약 group의 길이가 1개라면 ( 그룹이 한개밖에 존재하지 않는다면 점수는 0)
if len(group) == 1:
return 0
# 그렇지 않다면 첫번째 그룹과 두번째 그룹을 곱한 값을 반환해준다.
else:
return group[0] * group[1]