코딩테스트/백준

백준 10158 : 개미

Mev01 2021. 4. 18. 17:11

www.acmicpc.net/problem/10158

 

10158번: 개미

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

www.acmicpc.net

접근방법


여러 가지 방법 중에 제일 쉬운 방법은 x좌표와 y좌표를 분리해서 생각하는 것이다.

x좌표와 y좌표는 증가하다가 경계면에 부딪히면 감소하고, 감소하다가 경계면에 부딪히면 증가한다.

 

증감을 반복하는 것을 어떻게 구현해야 할까?

먼저 시작좌표 p에서 t를 더하게 되면 경계면이 없을 때 개미가 총 움직인 거리가 나온다.

testcase같이 p가 4이고 t가 8일 때 경계면이 없다면 개미의 마지막 x좌표는 12일 것이다.

 

경계면을 생성하기 위해서 나머지 연산을 이용한다. (p + t) % w

12에 가로 길이 6을 나머지 연산해주면 0이 나온다.

 

이렇게 하면 testcase는 통과하지만 맞지는 못한다.

그 이유는 감소하는 연산을 아직 고려하지 않았기 때문이다.

각각의 좌표가 감소하는 때는 증가하다가 경계면에 부딪힌 때이다.

이는 좌표를 격자의 크기로 나누었을 때 몫이 홀수 일 때와 같다.

 

예를 들어 4 -> 5 -> 6 -> 7 이렇게 좌표가 증가하는데 경계면이 6이라고 하면 개미는 4 -> 5 -> 6 -> 5 이렇게 진행한다.

증가할 때 4~6 까지는 6으로 나누어도 몫이 0이다. 하지만 7부터는 6으로 나누면 몫이 1이 된다.

 

따라서 마지막 좌표를 격자의 크기로 나누었을 때 몫이 홀수라면 격자의 크기에서 나머지 연산을 한 결과를 빼면 된다.

w - ((p + t) % w)

 

코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class baekjoon10158 {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;
		
		st = new StringTokenizer(br.readLine());
		int w = Integer.parseInt(st.nextToken());
		int h = Integer.parseInt(st.nextToken());
		
		st = new StringTokenizer(br.readLine());
		int p = Integer.parseInt(st.nextToken());
		int q = Integer.parseInt(st.nextToken());
		
		int t = Integer.parseInt(br.readLine());
		
		int np = (p + t) % w;
		int nq = (q + t) % h;
		
		if((p + t) / w % 2 ==1){
			np = w - np;
		}
		if((q + t) / h % 2 ==1){
			nq = h - nq;
		}
		
		sb.append(np).append(' ').append(nq);
		System.out.print(sb.toString());
	}
}

 

'코딩테스트 > 백준' 카테고리의 다른 글

백준 1939 : 중량제한  (0) 2021.06.22
백준 1202 : 보석 도둑  (0) 2021.06.16
백준 2293 : 동전 1  (0) 2020.09.21
백준 2580 : 스도쿠  (0) 2020.09.14
백준 2108 : 통계학  (0) 2020.09.05