🟦/백준

[골드 3] 사다리 조작

진뚱이용 2023. 8. 19. 23:36

https://www.acmicpc.net/problem/15684

 

15684번: 사다리 조작

사다리 게임은 N개의 세로선과 M개의 가로선으로 이루어져 있다. 인접한 세로선 사이에는 가로선을 놓을 수 있는데, 각각의 세로선마다 가로선을 놓을 수 있는 위치의 개수는 H이고, 모든 세로선

www.acmicpc.net

시발 문제 리뷰 안 할 수가 없다 진짜 헤맸다

1. 일단 가로세로 한번 헷갈렸음

2.  사다리 존재를 1로만 표시했더니 좀 어려웠다 차라리 왼쪽을 1 오른쪽을 2로 표기하자

푸는 방식

1. (놓을 수 있는 자리) C (0,1,2,3) 조합 문제이다

2. 나는 왼쪽을 기준으로 오른쪽으로 그을 거다 그러니까 오른쪽에 출발 1 이 있는지만 체크하면 됨

 

제일 해맨부분

for(int i = last_i ; i < ~

for(int j = last_j+1 ; j < ~

 

평소 last_pick +1부터 탐색하는 조합 기법을 사용했었는데

이거는 j를 넘어서 i가 1개 추가되면 바보같이 j를 0부터가 아닌 last_j+1 그러니까

덜 탐색하게 되는 방식이었다

과감하게 int j = 0부터로 바꿔주자  하지만 더 탐색하는 경우가 생기긴 하겠다 

import java.io.*;
import java.util.*;

public class Main {

	public static boolean find_can = false;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int N, M, H;
		int[][] arr; // 0은 밑으로 내려가 1은 오른쪽으로이동 2은 왼쪽으로 이동

		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		H = Integer.parseInt(st.nextToken());
		arr = new int[H][N];

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int a = Integer.parseInt(st.nextToken());
			int b = Integer.parseInt(st.nextToken());

			arr[a - 1][b - 1] = 1;
			arr[a - 1][b - 1 + 1] = 2;
		}

		///////////////////////////////////////////////////////////

		// (0개 놓았을때 놓을 수 있는 경우의 수) C (0,1,2,3);

		int answer = -1;

		for (int r = 0; r <= 3; r++) {
			recursion(arr, r, 0, 0, -1);
			if (find_can) {
				answer = r;
				break;
			}
		}

		System.out.println(answer);
	}

	public static void recursion(int[][] arr, int r, int depth, int last_i, int last_j) {

		if (depth == r) {
			boolean can = true;

			for (int j = 0; j < arr[0].length; j++) {
				if (j != where_is_my_goal(arr, j))
					can = false;
			}

			if (can)
				find_can = can;

			return;
		}

		for (int i = last_i; i < arr.length; i++) {
			for (int j = 0; j < arr[0].length - 1; j++) {
				if (arr[i][j] == 0) {

					// 오른쪽에 출발 사다리 있어
					if (arr[i][j + 1] == 1) {
						continue;
					}
					arr[i][j] = 1;
					arr[i][j + 1] = 2;
					recursion(arr, r, depth + 1, i, j);
					arr[i][j] = 0;
					arr[i][j + 1] = 0;
				}
			}
		}

	}

	public static int where_is_my_goal(int[][] arr, int start) {
		int x = start;
		for (int i = 0; i < arr.length; i++) {
			if (arr[i][x] == 1) {
				x = x + 1;

			} else if (arr[i][x] == 2)
				x = x - 1;
		}

		return x;
	}
}