[백준 15685번] 드래곤커브

박형진·2022년 10월 3일
0

https://www.acmicpc.net/problem/15685

1. 단순 구현

import sys


def rotate_90_degree_and_add(a, end_pos):
    cur_x, cur_y = end_pos[0], end_pos[1]

    n = len(a)
    m = len(a[0])
    result = [[0] * n for _ in range(m)]
    for i in range(n):
        for j in range(m):
            if a[i][j] == 9:
                next_x, next_y = j, n - 1 - i
            result[j][n - 1 - i] = a[i][j]

    move = [cur_x - next_x, cur_y - next_y]
    for i in range(n):
        for j in range(m):
            if result[i][j] == 1:
                nx = i + move[0]
                ny = j + move[1]
                a[nx][ny] = 9
                next_end = (nx, ny)
                continue

            if result[i][j] != 0:
                nx = i + move[0]
                ny = j + move[1]
                a[nx][ny] = result[i][j]

    # end 점 2로 수정
    a[cur_x][cur_y] = 2
    return a, next_end

def make(start_x, start_y, dir, gen):
    if dir == 0:
        end = (start_x, start_y + 1)
    elif dir == 1:
        end = (start_x - 1, start_y)
    elif dir == 2:
        end = (start_x, start_y - 1)
    else:
        end = (start_x + 1, start_y)

    # 초기값
    graph = [[0] * 101 for _ in range(101)]
    graph[start_x][start_y] = 1
    graph[end[0]][end[1]] = 9

    if gen == 0:
        for i in range(len(graph)):
            for j in range(len(graph)):
                if graph[i][j] != 0:
                    answer[i][j] = 1
    else:
        for _ in range(gen):
            graph, end = rotate_90_degree_and_add(graph, end)
        for i in range(len(graph)):
            for j in range(len(graph)):
                if graph[i][j] != 0:
                    answer[i][j] = 1


answer = [[0] * 101 for _ in range(101)]
n = int(input())
for _ in range(n):
    y, x, d, g = map(int, sys.stdin.readline().rstrip().split())
    make(x, y, d, g)

cnt = 0
for i in range(0, len(answer) - 1):
    for j in range(0, len(answer) - 1):
        if answer[i][j] == answer[i+1][j] == answer[i][j+1] == answer[i+1][j+1] == 1:
            cnt += 1
print(cnt)

2. 방향 규칙을 사용한 구현

import sys

"""
https://www.acmicpc.net/problem/15685

0: x 좌표가 증가하는 방향 (→)
1: y 좌표가 감소하는 방향 (↑)
2: x 좌표가 감소하는 방향 (←)
3: y 좌표가 증가하는 방향 (↓)

주어진 예시를 방향을 나타내는 숫자를 사용하여 규칙을 찾아내는 풀이 

ex)
1
4 2 1 3
[1, 2, 3, 2, 3, 0, 3, 2]
"""
dx = [0, -1, 0, 1]
dy = [1, 0, -1, 0]

n = int(input())
graph = [[0] * 101 for _ in range(101)]

for _ in range(n):
    y, x, d, g = map(int, sys.stdin.readline().rstrip().split())
    dir = [d]
    graph[x][y] = 1

    for _ in range(g):
        add = []
        for i in range(len(dir) - 1, -1, -1):
            add.append((dir[i] + 1) % 4)
        dir.extend(add)

    for i in dir:
        x += dx[i]
        y += dy[i]
        graph[x][y] = 1

cnt = 0
for i in range(0, len(graph) - 1):
    for j in range(0, len(graph) - 1):
        if graph[i][j] == graph[i + 1][j] == graph[i][j + 1] == graph[i + 1][j + 1] == 1:
            cnt += 1
print(cnt)

3. 후기

예전에 풀었던 문제중에 배열을 90도 회전하는 문제가 생각나서 무작정 구현해서 풀었다. 풀면서도 풀이가 지저분해서 맞는가 싶었는데 방향의 규칙을 이용한 풀이가 존재해서 읽고 다시 풀어봤다.

profile
안녕하세요!

0개의 댓글