Algorithm/Implementation

[백준 15685번] 드래곤 커브

킹우현 2023. 9. 2. 19:43

n = int(input())

area = [[0]*101 for _ in range(101)]

data = [list(map(int,input().split())) for _ in range(n)]

answer = 0

dx = [1,0,-1,0]
dy = [0,-1,0,1]

for x,y,d,g in data:

    routes = [d]
    area[x][y] = 1

    for i in range(g):
        for j in range(len(routes)-1,-1,-1):
            routes.append((routes[j]+1)%4)

    for route in routes:
        nx, ny = x + dx[route], y + dy[route]
        area[nx][ny] = 1
        x, y = nx, ny

for i in range(100):
    for j in range(100):
        if area[i][j] == 1 and area[i][j+1] == 1 and area[i+1][j] == 1 and area[i+1][j+1] == 1:
            answer += 1

print(answer)

이번 문제는 각 입력 값마다 시작 x좌표, y좌표가 주어지고 이동하는 방향과 이동 횟수가 주어졌을 때 모든 경로를 이동한 후의 결과 값을 확인하는 문제이다.

 

처음에 이 문제를 접근할 때는 '끝점을 기준으로 90도 회전시킨다'라는 멘트 때문에 2차원 배열을 어떻게 하면 회전시킬 수 있을까 하고만 고민해 보았는데, 생각보다 공식이 잘 도출되지 않아서 다른 사람의 풀이를 참고하였다.

 

문제풀이는 생각보다 단순했다. 처음 시작 방향을 임의로 0으로 지정했을 때, 세대가 지나면 지날수록 다음 세대가 가지는 방향은 다음과 같다.

 

0세대 : 0

1세대 : 0 / 1

2세대 : 0 1 / 2 1

3세대 : 0 1 2 1 / 2 3 2 1

4세대 : 0 1 2 1 2 3 2 1 / 2 3 0 3 2 3 2 1

 

즉, 전 세대의 정보를 뒤집어 거기에 1을 더해주면 된다. 4면 다시 처음인 0으로 돌린다. ⭐️

 

따라서 위 규칙에 따라 모든 세대의 방향을 구해준 뒤, 모든 드래곤 커브의 경로를 1로 표시해주면 문제를 간단하게 풀 수 있었다.

 

이번 문제는 문제에서 주어진 설명에 정신이 팔려서 입력 값과 방향성에 대한 패턴을 인지하지 못한 채 엉뚱한 방향으로 구현을 시도하게 되었었다. 그리고 문제에서 주어진 조건을 제대로 인지하지 않고 평소 2차원 배열 이동방식으로 구현하다보니 잘못된 답이 나오기도 하였다.

 

배운 점 및 느낀 점

  1. 로직이나 패턴이 생각보다 잘 도출되지 안된다면, 문제에서 주어진 입력 값과 연관지어서 새로운 패턴을 찾아보도록 하자.
  2. 평소에 풀던 방식이 익숙하다고 그대로 풀지말고, 문제에서 주어진 조건(x / y의 범위, 좌표의 이동 방향 등)을 꼼꼼하게 읽어보자.

'Algorithm > Implementation' 카테고리의 다른 글

[백준 19236번] 청소년 상어  (0) 2023.09.06
[백준 17144번] 미세먼지 안녕!  (0) 2023.09.04
[백준 14499번] 주사위 굴리기  (0) 2023.08.30
[백준 15686번] 치킨 배달  (0) 2023.08.20
[백준 14890번] 경사로  (0) 2023.08.17