상세 컨텐츠

본문 제목

[Python] 크레인 인형뽑기

프로그래밍

by 독서와 여행 2021. 4. 13. 21:58

본문

문제를 처음에 잘못 이해했다. 뿌요뿌요 마냥 두개 모이면 바로 터지는건줄 알았는데..

그게 아니라 그냥 일단 다 넣고 거기서 터트리는거였다..

 

게다가 멍청하게 moves 가 [1,3] 이렇게 온다고 하면 [1][0], [2][0] 이렇게 2차원 배열이니까 앞에를 

바꿔줘야 하는데 [0][1][0][2] 이렇게 뽑고 있엇다.. 너무 멍청하고... 배열 왜 이상하게 접근하냐

하여튼 풀었다. 일단 1번 케이스와 2번 케이스가 문제였음...  2번은 stack에 모두 같은 인형이 들어갔을 때 이다.

1번은 print로 해놓았는데 stack[-1] == stack[0] 이 되기 때문에 문자열이 1개만 남아버리면 같아져 버린다..

다른 사람들 풀이를 한 번 봐야지 내 풀이는 솔직히 너무 더러워...

def solution(board, moves):
    board_size = len(board)
    answer = 0
    stack = []
    for num in moves:
        for i in range(board_size):
            if board[i][num-1] != 0:
                stack.append(board[i][num-1])
                board[i][num-1] = 0
                break

    print(stack)
    answer = is_match(stack)


    return answer



def is_match(stack):
    answer = 0
    end = 1
    start = 0
    empty = False
    while(end <= len(stack) - 1):
        empty = True
        if(stack[start] == stack[end]): #다 들어갔는데 다르지 않아서 del안될수있음 1개 남으면 start -1 / end 0 이라서 같아짐..!! 와 충격
            end += 1
            empty = False
        else : 
            del_point = end - start
            if (del_point > 1) : 
                for _ in range(0,del_point):
                    del stack[start] #지우면 밀리니까 그 자리 그냥 지우면 됨
                    answer += 1
                start = start - 1
                end = start + 1
            else:
                start += 1
                end += 1
    if(not empty and start > 0):
        del_point = end - start
        for _ in range(0,del_point):
            answer += 1
        
    return answer


print(solution([[0, 0, 0, 0, 0], [0, 0, 1, 0, 3], [0, 2, 5, 0, 1], [4, 2, 4, 4, 2], [3, 5, 1, 3, 1]] ,[1, 5, 3, 5, 1, 2, 5, 1, 4, 3] )) # 1번 테스트 예제

 

 

다른 사람의 코드!

velog.io/@matisse/%EC%B9%B4%EC%B9%B4%EC%98%A4-%ED%81%AC%EB%A0%88%EC%9D%B8-%EC%9D%B8%ED%98%95-%EB%BD%91%EA%B8%B0-python

불러오는 중입니다...

def solution(board, moves):
    bucket = []
    answer = []
    for move in moves:
        for i in range(len(board)):
            if board[i][move-1] > 0:
                bucket.append(board[i][move-1])
                board[i][move-1] = 0
                if bucket[-1:] == bucket[-2:-1]: #bucket 제일 최근에 추가된 거랑 그 전꺼랑 같니?
                    answer += bucket[-1:] #같으면 answer에 추가
                    bucket = bucket[:-2] # 같으면 인덱스 -1,-2 지워 answer에 추가했으니
                break
    return len(answer)*2

와 이건 발상이 좋다. 다 쌓고나서 하는게 아니라 쌓으면서 나가는구나 되게 깔끔하다.

근데 궁금한건 answer에 [111] 이렇게 들어오면 2개밖에 처리를 못 하는데 어떻게 통과를 한거지..?

발상 자체는 배워야 겠다. 더하고 지우고 

 

 

 

'프로그래밍' 카테고리의 다른 글

[Kotlin] 음양 더하기 // 두 정수 사이의 합  (0) 2021.04.18
[Kotlin] 실패율  (0) 2021.04.18
[Kotlin] 정규식  (0) 2021.04.10
[Kotlin] 시퀀스를 이용한 피보나치 수열  (0) 2021.04.09
[Kotlin] forEach / for EachIndexed  (0) 2021.04.08

관련글 더보기

댓글 영역