알고리즘 문제 풀이

백준 20493 세상은 하나의 손수건 (JAVA 자바)

superbono 2021. 7. 31. 18:13

문제 출처 - https://www.acmicpc.net/problem/20493

 

20493번: 세상은 하나의 손수건

오래된 운동화를 신고, 시원한 공기와 투명한 하늘 아래 따뜻한 햇빛을 받으며 새로 마주하는 이 거리와 손잡고 걷는다. 복잡한 생각 없이 설레는 마음으로 걷다 보면 뛰고 싶고, 같이 달리다 보

www.acmicpc.net

 

문제

오래된 운동화를 신고, 시원한 공기와 투명한 하늘 아래 따뜻한 햇빛을 받으며 새로 마주하는 이 거리와 손잡고 걷는다. 복잡한 생각 없이 설레는 마음으로 걷다 보면 뛰고 싶고, 같이 달리다 보면 숨이 차다. 헐떡거리며 주저앉는 순간에도, 세상은 한 장의 손수건 같다.

준원이는 천하제일코딩대회가 진행 중인 지금 구름같이 행복한 하루를 보내고 있지만, 애석하게도 여러분은 문제를 풀어야 한다. 준원이가 오늘 에버랜드 대신 x축과 y축이 있는 좌표평면의 원점에서 걷고 있다고 생각해보자. 준원이의 초기 위치는 (0, 0)이고, x축 방향으로 초당 1의 속도로 움직이고 있다. 즉, 매초 준원이의 x좌표가 1만큼 증가하고 있다. 그렇지만 준원이는 가끔씩 방향을 바꾼다. 방향을 바꿀 때에는 왼쪽으로 90도만큼 돌거나 오른쪽으로 90도만큼 돈다.


 

준원이가 방향을 바꾼 기록이 입력으로 주어졌을 때, 준원이가 T초간 걸어간 이후 도착했을 좌표를 구하는 프로그램을 작성하시오.

 

입력

첫째 줄에는 준원이가 방향을 바꾼 횟수 N과, 준원이가 걸어간 시간 T가 공백을 사이에 두고 주어진다.

이후 N개의 줄에, 준원이가 i번째로 방향을 바꾼 시간 Ti과, 준원이가 왼쪽으로 돌았는지 또는 오른쪽으로 돌았는지 나타내는 문자열 Si가 공백을 사이에 두고 주어진다. Si는 준원이가 왼쪽으로 돌았으면 left이고, 오른쪽으로 돌았으면 right이다.

 

출력

준원이가 T초간 걸어간 이후 도착한 좌표가 (x, y)라면, x와 y를 차례로 공백을 사이에 두고 출력한다.

 

문제 유형

구현

 

코드

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

public class BJ20493_세상은하나의손수건 {
	static int N, T;
	static int dr[] = {1, 0, -1, 0};
	static int dc[] = {0, -1, 0, 1};
	static int cR, cC, time, dir, curTime, totalTime;
	static String d;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		N = Integer.parseInt(st.nextToken()); // 방향 바꾼 횟수
		T = Integer.parseInt(st.nextToken()); // 총 걸어간 시간
		
		for (int tc = 0; tc < N; tc++) {
			st = new StringTokenizer(br.readLine(), " ");
			totalTime = Integer.parseInt(st.nextToken());  
			curTime = totalTime - curTime;
			cR = cR + dr[dir] * curTime;
			cC = cC + dc[dir] * curTime;
			d = st.nextToken();
			if(d.equals("right")) {
				dir = (dir + 1) % 4;
			}else if(d.equals("left")) {
				dir = (dir + 3) % 4;
			}
			curTime = totalTime;
		}
		
		curTime = T - totalTime;
		cR = cR + dr[dir] * curTime;
		cC = cC + dc[dir] * curTime;
		System.out.println(cR + " " + cC);
	}
}

 

문제가 굉장히 감성적이다... 숨이 차서 헐떡대는 순간에도 세상은 하나의 손수건이라는게 무슨 말인지 모르겠지만 아무튼 손수건이라니까 손수건이라고 생각하나보다. 나는 이런 사분면에서 방향 바꾸고 이러는 문제가 자꾸 헷갈린다. 구현 문제 중에 거북이 라는 문제가 있는데 그거 풀 때도 느꼈다... 많이 풀어볼 필요가 있다!