PS/BOJ

2873

easy16 2022. 5. 10. 01:44

롤러코스터  : https://www.acmicpc.net/problem/2873

 

참조 사이트 :  https://dundung.tistory.com/45

 

확인용 input

4 3
5 1 3
2 4 8
1 1 2 
1 1 1

3 4
5 1 3 1
2 4 8 1
1 1 2 1

4 4
10 10 10 10
1  10 10 10
10 10 10 10
10 10 10 10

 

참조 사이트에서 흰색칸을 피해가는 경우, 그 칸을 포함 총 3개를 놓치게 된다. 

따라서 4by 4의 경우 아래와 같이 나왔다.

S 1 3 1

1 3 1 3

3 1 3 1

1 3 1 E

 

어떻게 풀까 고민을 했지만 떠오르는 것이 없었다.

 

사이트를 확인해보니, 흑/백 체스판을 구별을 하고, 3인 부분은 무시하고 1로 구성된 부분에서 최소값을 찾아 그 부분만 지나지 않도록 구현을 하더라 (이 부분에서 탐욕법이 적용되었다고 생각한다.)

 

X 10 X 10

10 X 10 X

X 10 X 10

1 X 10 X

 

이런 식으로 두고 최소값을 찾아 주는데, 루프에서 (i+j)%2==0인 부분만 확인하면된다.

나머지 풀이법은 사이트 참조.

 

 

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

import java.util.*;

public class Main {

	static int R, C;
	static boolean DBG = false;
	static int[][] arr;

	public static void main(String[] args) throws IOException {

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		arr = new int[R][C];

		for (int i = 0; i < R; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j < C; j++) {
				arr[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		StringBuilder sb = new StringBuilder();
		StringBuilder sb2 = new StringBuilder();

		if (R % 2 == 1) {
			for (int i = 0; i < R; i++) {
				if (i % 2 == 0) {
					for (int j = 0; j < C-1; j++) {
						sb.append('R');
					}
					if ( i != R-1)
						sb.append('D');						
				} else {
					for (int j = C - 2; j >= 0; j--) {						
						sb.append('L');
					}
					sb.append('D');	
				}

			}
		} else if (C % 2 == 1) {
			for (int i = 0; i < C; i++) {
				if (i % 2 == 0) {
					for (int j = 0; j < R-1; j++) {
						sb.append("D");
					}
					if ( i != C-1)
						sb.append("R");
					
				} else {
					for (int j = R - 2; j >= 0; j--) {
						sb.append( "U");
					}
					sb.append("R");
				}
			}

		} else {// 둘다 짝수
			int min = Integer.MAX_VALUE;
			int mc = 0, mr = 0;
			for (int i = 0; i < R; i++) {
				for (int j = 0; j < C; j++) {
					if ((i + j) % 2 == 1) {
						if (arr[i][j] < min) {
							min = arr[i][j];
							mr = i;
							mc = j;
						}
					}
				}
			}
			int sr = 0;
			int sc = 0;
			int er = R - 1;
			int ec = C - 1;

			while (er - sr > 1) {

				if (sr / 2 < mr / 2) {
					int tmp = C - 1;
					while (tmp-- > 0)
						sb.append('R');
					sb.append('D');
					tmp = C - 1;
					while (tmp-- > 0)
						sb.append('L');
					sb.append('D');
					sr += 2;
				}

				if (mr / 2 < er / 2) {
					int tmp = C - 1;
					while (tmp-- > 0)
						sb2.append('R');
					tmp = C - 1;
					
					sb2.append('D');
					while (tmp-- > 0)
						sb2.append('L');
					sb2.append('D');
					er -= 2;
				}
			}

			while (ec - sc > 1) {
				if (sc / 2 < mc / 2) {
					sb.append('D');
					sb.append('R');
					sb.append('U');
					sb.append('R');
					sc += 2;
				}
				if (mc / 2 < ec / 2) {
					sb2.append('D');
					sb2.append('R');
					sb2.append('U');
					sb2.append('R');
					ec -= 2;
				}
			}
			if (sr == mr) {
				sb.append('D');
				sb.append('R');
			} else {
				sb.append('R');
				sb.append('D');
			}
			sb.append(sb2.reverse());
		}
		System.out.println(sb);
	}

}