문제
https://programmers.co.kr/learn/courses/30/lessons/17679
처음 작성한 코드
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
- 4개가 모여 지워진 블록은 '_'로 변경했다.
- 처음에 board를 돌면서 4개가 같으면 그 값들을 모두 소문자로 변경시켰다. -> 비교할 땐 대문자로 바꿔서..
- flag 변수를 통해 더이상 같은 4개가 없으면 answer를 return하며 함수를 종료시켰다.
- 세로를 돌면서 소문자라면 lower에 넣고('_'로 변환시킨 후) 아니면 upper에 넣었다. -> upper는 아직 안 지워진 블록이기 때문에 다음 턴에서 바닥에 깔리고 그 위에가 '_'로 깔려야한다.
- while로 lower를 먼저 도는 이유는 인덱스가 0부터기 때문에 위에는 _로 깔리고 밑에가 영어로 깔리는게 당연하기 때문에 lower를 먼저 채웠다.
- 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 |