본문 바로가기

CodingTest/Programmers

[ 프로그래머스 ] 혼자 놀기의 달인

처음에 문제가 눈에 잘 안 들어와서 당황했다. 설명식의 문제가 간만에 나와서 약간 놀라 흠칫했던 것 같다.

 

 

def solution(cards):
    groups = []
    visited = [False] * len(cards)
    for i in range(len(cards)):
        if not visited[i]:
            k = cards[i]
            group = []
            
            while True:
                if visited[cards[k-1]-1] == True:
                    break
                group.append(cards[k-1])
                visited[cards[k-1]-1] = True
                k = cards[k-1]
            groups.append(group)
    groups.sort(key=len, reverse=True)
    answer = len(groups[0]) * len(groups[1])
    return answer

 

 

 

풀이 시간 15분. 1차시도 실패.. 뭘까?

 

ㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎㅎ

 

문제 다시 읽고 바로 찾았다 ㅋㅋㅋ 

 

 

# 수정 전#

    answer = len(groups[0]) * len(groups[1])
    

# 수정 후#

if len(groups) > 1:
        answer = len(groups[0]) * len(groups[1])
    else:
        answer = 0

 

꽤 자주 하는 실수라서 금방 찾았다. 배열의 가장 큰/작은 2개를 엮어서 마지막 결과낼 때 항상 저렇게 인덱스 접근해서 에러 발생하는 경우가 있다. 

 

이렇게 연 상자들은 1번 상자 그룹입니다. 이제 1번 상자 그룹을 다른 상자들과 섞이지 않도록 따로 둡니다. 만약 1번 상자 그룹을 제외하고 남는 상자가 없으면 그대로 게임이 종료되며, 이때 획득하는 점수는 0점입니다.

 

이번 문제는 특히 이렇게 친절하게 얘기도 해줘서 오류를 금방 찾았고 금방 해결했다. 

 

 

def solution(cards):
    groups = []
    visited = [False] * len(cards)
    for i in range(len(cards)):
        if not visited[i]:
            k = cards[i]
            group = []
            
            while True:
                if visited[cards[k-1]-1] == True:
                    break
                group.append(cards[k-1])
                visited[cards[k-1]-1] = True
                k = cards[k-1]
            groups.append(group)
    groups.sort(key=len, reverse=True)
    if len(groups) > 1:
        answer = len(groups[0]) * len(groups[1])
    else:
        answer = 0
    return answer

 

 

 

그런데 .. 이런 케이스에서 아래 풀이보다 더 예쁘게 해결이 가능한 방법이 있었던 것 같은데..

다른 분들 풀이 봐도 내 풀이랑 비슷하게 하셨다. 이게 최선인 듯 하다.

 

그룹 만들기 문제.