1 분 소요

사용 언어: 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] # 이 게임에서 얻을 수 있는 최고 점수
  • 테스트 케이스: 성공
  • 제출 결과: 성공

IMG_0480

다른 풀이

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 리스트가 있다는 것이 차이점이다.


💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기