20061: 모노미노도미노 2

ewillwin·2023년 7월 22일
0

Problem Solving (BOJ)

목록 보기
145/230

풀이 시간

  • 1h 39m
  • 그냥 구현하라는 대로 구현하면 되는 문젠데 약간 뻘짓해서 풀이 시간이 길었다

구현 방식

  • 일단 초록색 보드 (green)과 파란색 보드 (blue)를 따로 2차원 리스트로 생성했다

  • 아래를 차례대로 구현해주면 된다
    1) 초록색 판 이동
    2) 초록색 판 점수 획득 + 행 제거
    3) 초록색 연한 칸 확인 + 행 제거
    4) 파란색 판 이동
    5) 파란색 판 점수 획득 + 열 제거
    6) 파란색 연한 칸 확인 + 열 제거

  • 1), 4)는 각각 move_green, move_blue 함수를 통해 구현함
    -> t에 따라서 조건 분기 + while문을 돌며 보드의 끝에 도달하거나 다른 타일을 만났을 경우에 그리고자 하는 타일을 그려주고 break

  • removed_green 리스트에는 0으로 초기화될 row의 index가 들어간다
  • removed_green 리스트의 길이만큼 for문을 돌며, 역순으로 행을 순회하여 green[i] = green[i-1]을 해주고 green[4]는 0으로 초기화해주는 방식으로 초록색 판의 행 제거를 구현했다

  • removed_blue 리스트에는 0으로 초기화될 column의 index가 들어간다
  • removed_blue 리스트의 길이만큼 for문을 돌며, 역순으로 열을 순회하여 blue[i][j] = blue[i][j-1]을 해주고 blue[i][4]를 0으로 초기화해주는 방식으로 파란색 판의 열 제거를 구현했다

  • 초록색 연한 칸 확인 + 행 제거 및 파란색 연한 칸 확인 + 열 제거도 이와 비슷한 방식으로 구현해주었다

코드

import sys


green = [[0] * 4 for _ in range(10)]
blue = [[0] * 10 for _ in range(4)]

def move_green(t, x, y):
    if t == 1:
        while True:
            if x >= 10:
                green[x-1][y] = 1; break
            if green[x][y] != 0:
                green[x-1][y] = 1; break
            x += 1
    elif t == 2:
        while True:
            if x >= 10:
                green[x-1][y] = 1; green[x-1][y+1] = 1; break
            if green[x][y] != 0 or green[x][y+1] != 0:
                green[x-1][y] = 1; green[x-1][y+1] = 1; break
            x += 1
    elif t == 3:
        while True:
            if x >= 10:
                green[x-1][y] = 1; green[x-2][y] = 1; break
            if green[x][y] != 0:
                green[x-1][y] = 1; green[x-2][y] = 1; break
            x += 1

def move_blue(t, x, y):
    if t == 1:
        while True:
            if y >= 10:
                blue[x][y-1] = 1; break
            if blue[x][y] != 0:
                blue[x][y-1] = 1; break
            y += 1
    elif t == 2:
        while True:
            if y >= 10:
                blue[x][y-1] = 1; blue[x][y-2] = 1; break
            if blue[x][y] != 0:
                blue[x][y-1] = 1; blue[x][y-2] = 1; break
            y += 1
    elif t == 3:
        while True:
            if y >= 10:
                blue[x][y-1] = 1; blue[x+1][y-1] = 1; break
            if blue[x][y] != 0 or blue[x+1][y] != 0:
                blue[x][y-1] = 1; blue[x+1][y-1] = 1; break
            y += 1


N = int(sys.stdin.readline()[:-1])
cmd = []
for n in range(N):
    t, x, y = map(int, sys.stdin.readline()[:-1].split())
    cmd.append((t, x, y))

total_score = 0
for n in range(N):
    t, x, y = cmd[n]

    ##### 초록색 판 이동
    move_green(t, x, y)

    ##### 초록색 판 점수 획득 + 행 제거
    removed_green = []
    for i in range(10):
        if sum(green[i]) == 4:
            removed_green.append(i)
            total_score += 1
    
    for row in removed_green:
        for i in range(row, 4, -1):
            green[i] = green[i-1]
        green[4] = [0, 0, 0, 0]
    
    ##### 초록색 연한 칸 확인 + 행 제거
    row_cnt = 0
    for i in range(4, 6):
        if sum(green[i]) != 0:
            row_cnt += 1
    
    for _ in range(row_cnt):
        for i in range(10-1, 4, -1):
            green[i] = green[i-1]
        green[4] = [0, 0, 0, 0]
            
    ##### 파란색 판 이동
    move_blue(t, x, y)

    ##### 파란색 판 점수 획득 + 열 제거
    removed_blue = []
    for j in range(6, 10):
        tmp = 0
        for i in range(4):
            tmp += blue[i][j]
        if tmp == 4:
            removed_blue.append(j)
            total_score += 1
    
    for col in removed_blue:
        for j in range(col, 4, -1):
            for i in range(4):
                blue[i][j] = blue[i][j-1]
        for i in range(4):
            blue[i][4] = 0

    ##### 파란색 연한 칸 확인 + 열 제거
    col_cnt = 0
    for j in range(4, 6):
        for i in range(4):
            if blue[i][j] != 0:
                col_cnt += 1
                break
    
    for _ in range(col_cnt):
        for j in range(10-1, 4, -1):
            for i in range(4):
                blue[i][j] = blue[i][j-1]
        for i in range(4):
            blue[i][4] = 0

print(total_score)
result = 0
for i in range(6, 10):
    result += sum(green[i])
for i in range(4):
    for j in range(6, 10):
        result += blue[i][j]
print(result)

결과

profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글