백준 3987 - 보이저 1호(Java)
알고리즘/백준

백준 3987 - 보이저 1호(Java)

www.acmicpc.net/problem/3987

 

3987번: 보이저 1호

첫째 줄에 시그널을 보내는 방향을 출력한다. (U: 위, R: 오른쪽, D: 아래, L: 왼쪽) 만약, 방향이 여러 가지가 존재한다면, U, R, D, L의 순서 중 앞서는 것을 출력한다. 둘째 줄에는 가장 긴 시간을 출

www.acmicpc.net

1. 유형

구현

 

2. 자료구조

없음

 

3. 기능

- 방향 바꾸기

- 무한대 판단

 

방향은 그냥 노가다로 16가지 경우의 수를 모두 구현

무한대는 맵 크기가 500*500이니깐 250001번이 나오면 무한대이다.

 

코드.

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

public class Main {
	static int N, M, sr, sc;
	static char map[][];
	static int dr[] = {-1,0,1,0};//상 오 하 왼
	static int dc[] = {0,1,0,-1};

	public static void main(String[] args) throws IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(in.readLine());
		N = Integer.valueOf(st.nextToken());
		M = Integer.valueOf(st.nextToken());
		map = new char[N][M];
		for (int i = 0; i < N; i++) {
			String s = in.readLine();
			for (int j = 0; j < M; j++) {
				map[i][j] = s.charAt(j);
			}
		}
		st = new StringTokenizer(in.readLine());
		sr = Integer.valueOf(st.nextToken())-1;
		sc = Integer.valueOf(st.nextToken())-1;
		int max=0;
		int dir=0;
		for (int i = 0; i < 4; i++) {
			int cr = sr;
			int cc = sc;
			int cd = i;
			int idx=1;
			while (true) {
				int nr = cr + dr[cd];
				int nc = cc + dc[cd];
				if(idx>250000)
					break;
				if (nr < 0 || nr >= N || nc < 0 | nc >= M || map[nr][nc] == 'C') {
					break;
				}
				if (map[nr][nc] == '/' || map[nr][nc] == '\\') {
					cd=change(map[nr][nc], cd);
				}
				cr = nr;
				cc = nc;
				idx++;
			}
			if(max < idx) {
				max = idx;
				dir = i;
			}
		}
		if(dir==0)
			System.out.println('U');
		else if(dir==2)
			System.out.println('D');
		else if(dir==3)
			System.out.println('L');
		else if(dir==1)
			System.out.println('R');
		if(max>250000) {
			System.out.println("Voyager");
		}else
			System.out.println(max);
	}

	static int change(char c, int d) {
		int nd =0;
		if (c == '/') {
			if (d == 0) {
				nd =1;
			} else if (d == 1) {
				nd = 0;
			} else if (d == 2) {
				nd = 3;
			} else if (d == 3) {
				nd= 2;
			}
		} else {
			if (d == 0) {
				nd=3;
			} else if (d == 1) {
				nd=2;
			} else if (d == 2) {
				nd=1;
			} else if (d == 3) {
				nd=0;
			}
		}
		return nd;
	}
}

5. 느낀점

실버2는 아닌거 같다.