[백준] 15685번: 드래곤 커브(골드3, 파이썬)

2024. 1. 2. 19:55· Coding Test/Python
목차
  1. 아이디어
  2. 내 코드

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

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

 

아이디어

드래곤 커브 방향의 규칙성을 찾고 구현하여 풀었다. (1시간 40분 정도 걸렸다.....)

 

4 2 1 3 이라는 입력이 들어왔을 때를 예로 들면,

g = 0 일 때, (4,2) 에서 1 방향으로 이동한다.

g = 1 일 때, (4,1) 에서 2 방향으로 이동한다.

g = 2 일 때, (3,1) 에서 3, 2 방향으로 이동한다.

g = 3 일 때, (2,2) 에서 3, 0, 3, 2 방향으로 이동한다.

..

 

즉,

d[0] = 1

d[1] = 2

d[2] = 3, 2

d[3] = 3, 0, 3, 2 

... 

 

이므로, 

g = n 일 때에는 d[n-1]을 뒤집고,  각 요소 d[n-1][i]에 1을 더한 후 4로 나눈 나머지가 해당 세대에 이동할 방향이 된다. 

 

x, y 좌표는 이 방향에 따라 계속 갱신해주면 된다. 

 

해당 부분을 코드로 구현하면, 

def sol(x, y, d, n):

    tmp_d = [d,]
    tmp_xy = [(x,y),]

    x += directions[d][0]
    y += directions[d][1]

    tmp_xy.append((x,y))


    for i in range(n): #세대만큼 반복

        nd = len(tmp_d)
        for i in range(nd-1, -1, -1):
            d = (tmp_d[i] + 1) % 4
            x += directions[d][0]
            y += directions[d][1]
            tmp_xy.append((x, y))
            tmp_d.append(d)
    return tmp_xy

 

위와 같이 작성할 수 있다.

먼저 0번째 커브를 이동해주고, 세대만큼 반복한다. 

이동 벡터(tmp_d)에 이동한 방향을 계속 추가하기 때문에 tmp_d의 맨 뒤에서부터 값을 가져와서 이동 방향을 구해주면 된다. 

 

내 코드

# x, y
directions = [(1, 0), (0,-1), (-1, 0), (0, 1)]

N = int(input())
curves = [[int(x) for x in input().split()] for _ in range(N)]

checks = [(1, 0), (1,-1), (0, -1)]


def sol(x, y, d, n):

    tmp_d = [d,]
    tmp_xy = [(x,y),]

    x += directions[d][0]
    y += directions[d][1]

    tmp_xy.append((x,y))


    for i in range(n): #세대만큼 반복

        nd = len(tmp_d)
        for i in range(nd-1, -1, -1):
            d = (tmp_d[i] + 1) % 4
            x += directions[d][0]
            y += directions[d][1]
            tmp_xy.append((x, y))
            tmp_d.append(d)
    return tmp_xy

def check(x, y):
    for ix, iy in checks:
        if (x+ix, y+iy) not in xy:
            return 0
    return 1


xy = []
for x, y, d, g in curves:
    xy.append(sol(x, y, d, g))

xy = [ x for y in xy for x in y ] # 2차원 리스트를 1차원으로
xy = set(xy)

count = 0
for x, y in xy:
    if check(x, y):
        count += 1

print(count)

'Coding Test > Python' 카테고리의 다른 글

[LeetCode] 199. Binary Tree Right Side View (medium, python)  (0) 2024.01.03
[LeetCode] 2. Add Two Numbers (medium, python)  (0) 2024.01.03
[백준] 15683번: 감시 (골드4, 파이썬)  (0) 2024.01.02
[백준] 14891번: 톱니바퀴 (골드5, 파이썬)  (1) 2023.12.30
[백준] 14890번: 경사로 (골드3, 파이썬)  (0) 2023.12.30
  1. 아이디어
  2. 내 코드
'Coding Test/Python' 카테고리의 다른 글
  • [LeetCode] 199. Binary Tree Right Side View (medium, python)
  • [LeetCode] 2. Add Two Numbers (medium, python)
  • [백준] 15683번: 감시 (골드4, 파이썬)
  • [백준] 14891번: 톱니바퀴 (골드5, 파이썬)
lim.dev
lim.dev
* 깃허브: https://github.com/Ellie010707
코딩림* 깃허브: https://github.com/Ellie010707
lim.dev
코딩림
lim.dev
전체
오늘
어제
  • 분류 전체보기 (205)
    • Network (6)
    • Backend (31)
      • Django (8)
      • Spring Boot (22)
    • Frontend (3)
    • Coding Test (107)
      • Python (93)
      • Java (1)
      • C_C#_C++ (4)
      • SQL (8)
    • Security (40)
      • 해커스쿨_FTZ (19)
      • VM (6)
      • CodeEngn (11)
      • Linux (4)
    • Project (2)
    • etc (12)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • crackme
  • stolenbyte
  • 해커스쿨ftz
  • ftz풀이
  • linux
  • CodeEngn
  • abex
  • 해킹
  • ftz 풀이
  • reversing
  • 리눅스마스터
  • ftz
  • hacking
  • 리버서
  • 해커스쿨
  • 리버싱
  • ftz write up
  • 코드엔진
  • ftz writeup
  • 리눅스

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
lim.dev
[백준] 15685번: 드래곤 커브(골드3, 파이썬)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.