TIL - algorithm - 03

12713 단어 algorithmalgorithm

# 크레인 인형뽑기 게임

def solution(board, moves):

    pick_ls = []                        # 크래인으로 뽑은 인형을 순서대로 담는 바구니 생성

    for x in moves:                     # x: 2차원 배열의 x좌표에 해당하는 값. 크레인이 해당 x좌표의 인형들을 위에서부터 차례대로 뽑게 된다.

        try:
            i = 0                       # i: 2차원 배열의 y좌표에 해당하는 값.
            while board[i][x-1] == 0:   # 인덱스가 1이 아닌 0부터 시작되므로, 'x좌표에서 1을 뺀 수'로 지정
                # print('!!!')

                i += 1                  # 해당 좌표(x-1, i)에 인형이 존재하지 않는 경우, y좌표를 +1 이동시켜야 하므로 변화식을 추가. i
                                        # 값은 인형이 존재할 때까지 계속 증가된다.

            pick_it = board[i].pop(x-1) # 해당 좌표에 인형이 존재하는 경우, 해당 좌표의 인형을 뽑아야 하므로, 인형에 해당되는 숫자를 제거
            pick_ls.append(pick_it)     # 뽑은 인형(숫자)을 바구니에 추가
            board[i].insert(x-1, 0)     # 숫자가 제거된 해당 좌표에 0을 삽입하여 빈자리를 메운다.
        
        except IndexError:              # x좌표에 인형이 존재하지 않는 경우 i값이 무한히 커지면서 index error가 발생.                   
                                        # except문으로 error발생을 방지.
            continue
            
    count_bf = len(pick_ls)             # 터트려져 사라지기 전 인형 수를 변수 count_bf에 지정
    count_af = len(pick_ls)             # 터트려져 사라진 후의 인형 수를 변수 count_af에 지정
    i = 0
    
    while i < count_af-1:               # '인덱스 error 발생을 막기' 위해 len(pick_ls)에서 1을 뺀 수로 조건을 설정했다.  
                                        # 어차피 마지막 인덱스 요소는 값을 비교할 다음 요소가 존재하지 않기 때문에, if문을 통해 요소 값을 비교할 필요가 없다.
        if  pick_ls[i] == pick_ls[i+1]: # 근접한 인형이 같은 종류인 경우를 찾아내는 조건
            pick_ls.pop(i)              
            pick_ls.pop(i)
            count_af = count_af -2
            i = 0
        else:
            i += 1 

    answer = count_bf - count_af     # 터트려져 사라지기 전 인형의 수 - 터트려져 사라진 후 인형의 수 = 터트려져 사라진 인형의 개수

    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,1,4]))

# review

  • 읽는 사람들이 쉽게 이해할 수 있는 코딩의 중요성을 깨달았다. 주석을 통해 생략된 설명을 덧붙이기, 직관적으로 식별할 수 있는 변수명 짓기 등을 적극적으로 활용하도록 하자. 간혹, 본인이 직접 쓴 코드를 이해하지 못하는 웃픈 상황이 발생할 수도 있기 때문이다.

  • while문은 조건식이 충족될 때까지 무한 반복된다. 당연히 무한 반복 시에는, while 문과 동일 선상에 있는 하단의 코드가 실행될 수 없다.

        try:
            i = 0                       
            while board[i][x-1] == 0:  수'로 지정
                # print('!!!')

                i += 1                 

            pick_it = board[i].pop(x-1)       # while문의 반복이 멈추기 전까지, 하단의 pop()과 append()는 실행될 수 없다.
            pick_ls.append(pick_it)    
            board[i].insert(x-1, 0)   
        
        except IndexError:             
                                      
            continue
            
  • continuebreak의 차이점

    • continue : 다음 loop로 넘어갈 때 사용한다(보통 for문에서 사용)

    • break : loop를 중단할 때 사용한다(보통 for문에서 사용)

  • 리스트 조작 시 IndexError가 발생하는 경우

    • 리스트 내부 인접 요소의 값을 비교하는 경우

    • while문을 활용하여 인덱스 i 값을 변화식으로 증가시키는 경우

            i = 0
            while board[i][x-1] == 0: 
                # print('!!!')

                i += 1    

좋은 웹페이지 즐겨찾기