[프로그래머스] 혼자 놀기의 달인
사용 언어: Python3, Java
문제
풀이
나의 풀이
def solution(cards):
cards = [(x-1) for x in cards] # 인덱스로 맞추기
groups = [] # 각 상자 그룹에 속한 카드 수
visited = [0] * len(cards) # 각 카드들이 뽑힌 카드인지
for i in range(len(cards)):
if visited[i]: # 이미 뽑힌 카드라면 패스
continue
next_open = cards[i] # 다음에 열 카드
visited[i] = 1 # i번째 카드는 열었음
cnt = 1 # 이미 위에서 하나 열었음
while visited[next_open] != 1: # 열어야 하는 상자가 이미 열려있을 때까지 반복
visited[next_open] = 1
next_open = cards[next_open] # 다음에 열 카드 갱신
cnt += 1
groups.append(cnt) # 몇 개의 카드가 뽑혔는지 groups에 추가
if len(groups) == 1:
return 0
groups.sort(reverse=True)
return groups[0] * groups[1] # 이 게임에서 얻을 수 있는 최고 점수
- 테스트 케이스: 성공
- 제출 결과: 성공
다른 풀이
def solution(cards):
cards = [(x-1) for x in cards] # 인덱스로 맞추기
groups = [] # 각 상자 그룹에 속한 카드 수
visited = [0] * len(cards) # 각 카드들이 뽑힌 카드인지
for x in cards:
if visited[x]:
continue
tmp = [] # ✅ 한 턴에 뽑은 카드 그룹들 임시 저장
while x not in tmp:
tmp.append(x) # 카드 뽑음
visited[x] = 1 # 방문 체크
x = cards[x] # 다음에 뽑을 카드 갱신
groups.append(len(tmp)) # 몇 개의 카드가 뽑혔는지 groups에 추가
if len(groups) == 1:
return 0
groups.sort(reverse=True)
return groups[0] * groups[1]
- 테스트 케이스: 통과
- 제출 결과: 성공
- 나의 풀이와 유사하지만 뽑은 카드들을 임시로 저장해두는
tmp
리스트가 있다는 것이 차이점이다.
💛 개인 공부 기록용 블로그입니다. 👻