dx, dy 테크닉을 이용해 격자에서의 이동을 간결하게 구현하는 방법을 배우게 됩니다.
0 | 1 | 2 | 3 | |
---|---|---|---|---|
dx | 1 | 0 | -1 | 0 |
dy | 0 | -1 | 0 | 1 |
⇒ 순서대로 +x축 방향(동쪽), -y축 방향(남쪽), -x축 방향(서쪽), +y축 방향(북쪽)
n = int(input())
dx, dy = [-1, 0, 0, 1], [0, -1, 1, 0] # 서, 남, 북, 동
x, y = 0, 0
for _ in range(n):
direction, distance = input().split()
distance = int(distance)
if direction == 'W':
x += dx[0] * distance
y += dy[0] * distance
if direction == 'S':
x += dx[1] * distance
y += dy[1] * distance
if direction == 'N':
x += dx[2] * distance
y += dy[2] * distance
if direction == 'E':
x += dx[3] * distance
y += dy[3] * distance
print(x, y)
move_dir 변수를 선언해 move_dir이 0이면 '서쪽', 1이면 '남쪽', 2이면 '북쪽', 3이면 '동쪽'과 같이 dx, dy에 한번에 접근할 수 있도록 하면 반복되는 코드를 줄일 수 있다.
dir_num = (dir_num + 1) % 4
북쪽, 즉 dir_num = 3인 경우 시계 방향으로 90' 회전하면 dir_num = 0이 되어야 하므로 dir_num = (dir_num + 1) % 4가 된다.
dir_num = (dir_num - 1 + 4) % 4
반시계 방향의 경우 -1을 하면 되지만, dir_num = 0일 때 dir_num = 3이 되려면 +4을 추가적으로 하며 dir_num = (dir_num + 3) % 4가 되도록 해야 한다.
# 북쪽 시작
dir_num = 3
x, y = 0, 0
# 동, 남, 서, 북
dx, dy = [1, 0, -1, 0], [0, -1, 0, 1]
n = input()
for i in n:
if i == 'L':
dir_num = (dir_num - 1 + 4) % 4
elif i == 'R':
dir_num = (dir_num + 1) % 4
else:
x, y = x + dx[dir_num], y + dy[dir_num]
print(x, y)
'L', 'R'일 때 방향 전환을 하고, 'F'일 때 이동한다.
0 | 1 | 2 | 3 | |
---|---|---|---|---|
dx | 1 | 0 | -1 | 0 |
dy | 0 | -1 | 0 | 1 |
⇒ 순서대로 행(x) 아래쪽 방향(남쪽), 열(y) 왼쪽 방향(서쪽), 행(x) 위쪽 방향(북쪽), 열(y) 오른쪽 방향(동쪽)
for dx, dy in zip(dxs, dys)
nx, ny = x + dx, y + dy
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
n = int(input()) # 격자 크기
grid = [list(map(int, input().split())) for _ in range(n)] # 격자
# 상하좌우
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
# 범위 확인
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
ans = 0
for i in range(n):
for j in range(n):
cnt = 0
for dx, dy in zip(dxs, dys):
nx, ny = i + dx, j + dy
if in_range(nx, ny) and grid[nx][ny] == 1:
cnt += 1
if cnt >= 3:
ans += 1
print(ans)
i행 j열을 한칸씩 돌아가며 상하좌우 중 1이 있으면 cnt += 1, cnt가 3 이상이면 ans += 1
0 | 1 | 2 | 3 | |
---|---|---|---|---|
dx | 0 | 1 | -1 | 0 |
dy | 1 | 0 | 0 | -1 |
# 격자 크기, 시간
n, t = map(int, input().split())
# 구슬 정(r행 c열 d방향)
r, c, d = input().split()
r = int(r) - 1
c = int(c) - 1
# 0번과 3번, 1번과 2번 반대방향
dxs, dys = [0, 1, -1, 0], [1, 0, 0, -1]
mapper = {
'R': 0,
'D': 1,
'U': 2,
'L': 3
}
dir_num = mapper[d]
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
while t:
nx, ny = r + dxs[dir_num], c + dys[dir_num]
if not in_range(nx, ny):
dir_num = 3 - dir_num
t -= 1
t -= 1
if t < 0:
break
r, c = r + dxs[dir_num], c + dys[dir_num]
print(r + 1, c + 1)
# 격자 크기, 시간
n, t = map(int, input().split())
# 구슬 정(r행 c열 d방향)
r, c, d = input().split()
r = int(r) - 1
c = int(c) - 1
# 0번과 3번, 1번과 2번 반대방향
dxs, dys = [0, 1, -1, 0], [1, 0, 0, -1]
mapper = {
'R': 0,
'D': 1,
'U': 2,
'L': 3
}
dir_num = mapper[d]
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < n
for _ in range(t):
nx, ny = r + dxs[dir_num], c + dys[dir_num]
if in_range(nx, ny):
r, c = nx, ny
else:
dir_num = 3 - dir_num
print(r + 1, c + 1)
격자에서의 이동
오른쪽(dir = 0): x는 그대로, y += 1
아래쪽(dir = 1): x += 1, y는 그대로
왼쪽(dir = 2): x는 그대로, y -= 1
위쪽(dir = 3): x -= 1, y는 그대로
확인사항
n, m = map(int, input().split())
answer = [[0] * m for _ in range(n)]
def in_range(x, y):
return 0 <= x and x < n and 0 <= y and y < m
# 우, 하, 좌, 상
dxs, dys = [0, 1, 0, -1], [1, 0, -1, 0]
x, y = 0, 0 # 시작 위치
dir_num = 0 # 0: 우, 1: 하, 2: 좌, 3: 상
# 초기값
answer[x][y] = 1
for i in range(2, n * m + 1):
# 다음 위치값 계산
nx, ny = x + dxs[dir_num], y + dys[dir_num]
# 나아갈 수 없으면 90' 회전
if not in_range(nx, ny) or answer[nx][ny] != 0:
dir_num = (dir_num + 1) % 4
# 다음 위치에 올바른 값 저장
x, y = x + dxs[dir_num], y + dys[dir_num]
answer[x][y] = i
for i in range(n):
for j in range(m):
print(answer[i][j], end=' ')
print()