algorithm

[백준 10158번 개미]

선호하는 2023. 12. 1. 09:00

문제 링크: https://www.acmicpc.net/problem/10158

 

10158번: 개미

가로 길이가 w이고 세로 길이가 h인 2차원 격자 공간이 있다. 이 격자는 아래 그림처럼 왼쪽 아래가 (0,0)이고 오른쪽 위가 (w,h)이다. 이 공간 안의 좌표 (p,q)에 개미 한 마리가 놓여있다. 개미는 오

www.acmicpc.net

<문제>

가로 길이가 w이고 세로 길이가 h인 2차원 격자 공간이 있다. 이 격자는 아래 그림처럼 왼쪽 아래가 (0,0)이고 오른쪽 위가 (w,h)이다. 이 공간 안의 좌표 (p,q)에 개미 한 마리가 놓여있다. 개미는 오른쪽 위 45도 방향으로 일정한 속력으로 움직이기 시작한다. 처음에 (p,q)에서 출발한 개미는 1시간 후에는 (p+1,q+1)로 옮겨간다. 단, 이 속력으로 움직이다가 경계면에 부딪치면 같은 속력으로 반사되어 움직인다.

위 그림은 6×4 격자에서 처음에 (4,1)에서 출발한 개미가 움직인 길을 보여주고 있다. 처음에 (4,1)에 있는 개미는 2시간 후에 (6,3)에 있으며 8시간 후에 (0,1)에 있다. 만일 그 개미가 처음에 (5,3)에 있었다면 매 시간마다 (6,4), (5,3), (4,2), (3,1)로 움직인다.

여러분은 크기 w×h인 격자 공간에서 처음에 (p,q)에서 출발하는 개미의 t시간 후의 위치 (x,y)를 계산하여 출력해야 한다. 개미는 절대 지치지 않고 같은 속력으로 이동한다고 가정한다.

문제에서 w와 h는 자연수이며 범위는 2 ≤ w,h ≤ 40,000이다. 그리고 개미의 초기 위치 p와 q도 자연수이며 범위는 각각 0 < p < w과 0 < q < h이다. 그리고 계산할 시간 t의 범위는 1 ≤ t ≤ 200,000,000이다.

입력

첫줄에는 w와 h가 공백을 사이에 두고 주어진다. 그 다음 줄에는 초기 위치의 좌표값 p와 q가 공백을 사이에 두고 주어진다. 3번째 줄에는 개미가 움직일 시간 t가 주어진다.

출력

출력은 t 시간 후에 개미의 위치 좌표 (x,y)의 값 x와 y를 공백을 사이에 두고 출력한다.

<문제 풀이>
처음에는 한 칸씩 차근차근 이동하면서 풀이했었다. 그렇게 하자 처음에는 메모리가 초과되고, 조금 수정해 보니 시간이 초과되는 문제가 있었다. 

두 번째는 벽에 닿을 때를 가정하고 풀이했다. x축이나 y축이 외곽에 닿을 경우, 그 반대 축은 이동한 만큼 위치를 변경하고 방향을 전환해 다시 진행했다. 그래도 시간이 초과되었다.

결국에는 x축과 y축을 따로 판단하기로 했다. 현재 x축, y축의 값에 전체 시간을 더한 값을 x축과 y축의 크기의 두 배로 나누고, 만약 그 나머지 값이  x축이나 y축보다 클 경우 역방향으로 진행한 것으로 처리해주었다.

 

<소스코드>

w, h = map(int, input().split())
now_x, now_y = map(int, input().split())
t = int(input())

t_x = t + now_x
t_y = t + now_y
ans_x = t_x % (w * 2)
ans_y = t_y % (h * 2)

if ans_y > h:
    ans_y = h * 2 - ans_y

if ans_x > w:
    ans_x = w * 2 - ans_x

print(ans_x, ans_y)

'algorithm' 카테고리의 다른 글

[프로그래머스 LV.3 네트워크]  (0) 2023.12.30
[프로그래머스 LV.3 베스트앨범]  (2) 2023.12.29
[백준 10157번 자리배정]  (0) 2023.11.30
[백준 10773번 제로]  (0) 2023.11.29
[백준 5427번 불]  (1) 2023.11.28