문제

문제

https://programmers.co.kr/learn/courses/30/lessons/17679

 

코딩테스트 연습 - [1차] 프렌즈4블록

프렌즈4블록 블라인드 공채를 통과한 신입 사원 라이언은 신규 게임 개발 업무를 맡게 되었다. 이번에 출시할 게임 제목은 프렌즈4블록. 같은 모양의 카카오프렌즈 블록이 2×2 형태로 4개가 붙

programmers.co.kr

 

처음 작성한 코드

def solution(m, n, board):
    from collections import deque
    answer = 0
    board = [list(i) for i in board]
    
    while True:
        flag = 0
        for i in range(m-1):
            for j in range(n-1):
                if board[i][j]!='_' and board[i][j].upper() == board[i][j+1].upper() == board[i+1][j].upper() == board[i+1][j+1].upper():
                    board[i][j] = board[i][j].lower()
                    board[i][j+1] = board[i][j+1].lower()
                    board[i+1][j] = board[i+1][j].lower()
                    board[i+1][j+1] = board[i+1][j+1].lower()
                    flag = 1
        
        if flag == 0: return answer
        
        for j in range(n):
            cnt = 0
            lower = deque()
            upper = deque()
            for i in range(m):
                if board[i][j].islower():
                    board[i][j] = '_'
                    lower.append(board[i][j])
                    cnt+=1
                else:
                    upper.append(board[i][j])
            
            index = 0
            while lower:
                board[index][j] = lower.popleft()
                index+=1
            while upper:
                board[index][j] = upper.popleft()
                index+=1
            
            answer += cnt
  1. 4개가 모여 지워진 블록은 '_'로 변경했다.
  2. 처음에 board를 돌면서 4개가 같으면 그 값들을 모두 소문자로 변경시켰다. -> 비교할 땐 대문자로 바꿔서..
  3. flag 변수를 통해 더이상 같은 4개가 없으면 answer를 return하며 함수를 종료시켰다.
  4. 세로를 돌면서 소문자라면 lower에 넣고('_'로 변환시킨 후) 아니면 upper에 넣었다. -> upper는 아직 안 지워진 블록이기 때문에 다음 턴에서 바닥에 깔리고 그 위에가 '_'로 깔려야한다.
  5. while로 lower를 먼저 도는 이유는 인덱스가 0부터기 때문에 위에는 _로 깔리고 밑에가 영어로 깔리는게 당연하기 때문에 lower를 먼저 채웠다.
  6. 4번에서 소문자라면 cnt를 1씩 증가하고 소문자의 갯수(==지워진 블록)를 cnt로 증가시켰기 때문에 answer에 cnt를 더했다.

 

깨달은 점

  • string.islower()하면 소문자인지 대문자인지 체크해준다.
  • c언어와는 다르게 a == b == c == d 이런식으로 2개 이상 비교가 가능하다.
  • 간단한 문제였지만 접근하는 데 오래 걸린 것 같다. 푸헹

'Programmers' 카테고리의 다른 글

[프로그래머스] 괄호 변환  (0) 2021.01.19
[프로그래머스] 문자열 압축  (0) 2021.01.18
[프로그래머스] 캐시  (0) 2021.01.15
[프로그래머스] 키패드 누르기  (0) 2021.01.14
[프로그래머스] 다트 게임  (0) 2021.01.14