https://www.acmicpc.net/problem/15684
15684๋ฒ: ์ฌ๋ค๋ฆฌ ์กฐ์
์ฌ๋ค๋ฆฌ ๊ฒ์์ N๊ฐ์ ์ธ๋ก์ ๊ณผ M๊ฐ์ ๊ฐ๋ก์ ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ธ์ ํ ์ธ๋ก์ ์ฌ์ด์๋ ๊ฐ๋ก์ ์ ๋์ ์ ์๋๋ฐ, ๊ฐ๊ฐ์ ์ธ๋ก์ ๋ง๋ค ๊ฐ๋ก์ ์ ๋์ ์ ์๋ ์์น์ ๊ฐ์๋ H์ด๊ณ , ๋ชจ๋ ์ธ๋ก์
www.acmicpc.net
ํ์ด๊ณผ์
check() :i๋ฒ ์ธ๋ก์ ์ ๊ฒฐ๊ณผ๊ฐ i๋ฒ์ด ๋์ค๋์ง ํ์ธํ๋ ํจ์
์ฌ๋ค๋ฆฌ 0๊ฐ ๋๊ณ check()ํ๊ธฐ
์ฌ๋ค๋ฆฌ 1๊ฐ๋ฅผ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด check()ํ๊ธฐ
์ฌ๋ค๋ฆฌ 2๊ฐ๋ฅผ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด check()ํ๊ธฐ
์ฌ๋ค๋ฆฌ 3๊ฐ๋ฅผ ๋๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด check()ํ๊ธฐ
๋ง์ฝ ์ฌ๋ค๋ฆฌ 1๊ฐ๋ฅผ ๋๋ ๊ณผ์ ์์ check()==true๊ฐ ๋๋ค๋ฉด ์ฌ๋ค๋ฆฌ 2๊ฐ, 3๊ฐ ๋๋ ๊ณผ์ ์ ํ์ํ์ง ์๋ค. ์๋ํ๋ฉด ๋ฌธ์ ์์ ์ต์๊ฐ์ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ฌ๋ค๋ฆฌ 1๊ฐ, 2๊ฐ๋ฅผ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด์ ์ด๋ป๊ฒ ๋์๊น?
๋ฐฑํธ๋ํน์ ์ฌ์ฉ
static boolean solve(int n, int row, int cnt){
if(n==cnt){
if(check()){
ans = Math.min(ans,n);
return true;
}
return false;
}
for(int i=row;i<H+1;i++){
for(int j=1;j<N;j++){
if(arr[i][j]==0 && arr[i][j+1]==0){
// ๋ค๋ฆฌ ๋๊ธฐ
arr[i][j]=1; // 1์ ๋ง๋๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
arr[i][j+1]=2; // 2๋ฅผ ๋ง๋๋ฉด ์ผ์ชฝ์ผ๋ก ์ด๋
if(solve(n+1,i,cnt)) return true;
arr[i][j]=0;
arr[i][j+1]=0;
}
}
}
return false;
}
cnt๊ฐ ๋์ ์ฌ๋ค๋ฆฌ ๊ฐฏ์์ด๊ณ , n์ด ํ์ฌ ๋์ ์ฌ๋ค๋ฆฌ ๊ฐฏ์์ด๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ค๋ฆฌ๋ 1๊ณผ 2๋ก ๋ํ๋๋ค.
1์ ๋ง๋๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
2๋ฅผ ๋ง๋๋ฉด ์ผ์ชฝ์ผ๋ก ์ด๋ํด์ผ ํ๋ค.
๋ ๋ฐฑํธ๋ํน ํจ์์ return ๊ฐ์ผ๋ก boolean์ ์คฌ๋๋ฐ, check()๊ฐ true์ด๋ฉด ์ฌ๋ค๋ฆฌ๋ฅผ ๋ ๋์๋ณด์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ ํด์ ์คํ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์์๋ค.
1744ms ๊ฒฝ์ฐ์๋ ์ฌ๋ค๋ฆฌ๋ฅผ ๊ฐฏ์์ ๋ฐ๋ผ ์์ฐจ์ ์ผ๋ก ๋๋ ๊ฒ์ด ์๋ 0๊ฐ,1๊ฐ,2๊ฐ,3๊ฐ,0๊ฐ,1๊ฐ,2๊ฐ,3๊ฐ, ... ์ด๋ฐ์์ผ๋ก ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํด ๊ฐฏ์์ ์๊ด์์ด ์ฌ๋ค๋ฆฌ๋ฅผ ๋์์ ์คํ์๊ฐ์ด ์ค๋๊ฑธ๋ ธ๋ค.
์ ์ฒด์ฝ๋
package com.mincheolsong;
import java.io.*;
import java.util.*;
public class Main {
static int N,M,H;
static int[][] arr;
static int ans;
static final int INF = (int)1e9;
static boolean go(int row, int col,int start){ // (1ํ, col์ด, ์์์์น)
if(arr[row][col]==9 && start==col){ // ๋ ๊น์ง ๋ด๋ ค๊ฐ๋๋ฐ ์์ ์์น ์ด์ ๋์ฐฉํ ๊ฒฝ์ฐ
return true;
}
if(arr[row][col]==0){ // ์๋๋ก ๋ด๋ ค๊ฐ๊ธฐ
if(go(row+1,col,start)) return true;
}else if(arr[row][col]==1){ // ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ธฐ
if(go(row+1,col+1,start)) return true;
}else if(arr[row][col]==2){ // ์ผ์ชฝ์ผ๋ก ๊ฐ๊ธฐ
if(go(row+1,col-1,start)) return true;
}
return false;
}
static boolean check(){
for(int i=1;i<N+1;i++){
if(!go(1,i,i)){ // (1ํ, i์ด, ์์์์น) ์์ ์ถ๋ฐ ์ํค๊ธฐ
return false;
}
}
return true;
}
static boolean solve(int n, int row, int cnt){
if(n==cnt){
if(check()){
ans = Math.min(ans,n);
return true;
}
return false;
}
for(int i=row;i<H+1;i++){
for(int j=1;j<N;j++){
if(arr[i][j]==0 && arr[i][j+1]==0){
// ๋ค๋ฆฌ ๋๊ธฐ
arr[i][j]=1; // 1์ ๋ง๋๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
arr[i][j+1]=2; // 2๋ฅผ ๋ง๋๋ฉด ์ผ์ชฝ์ผ๋ก ์ด๋
if(solve(n+1,i,cnt)) return true;
arr[i][j]=0;
arr[i][j+1]=0;
}
}
}
return false;
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
arr = new int[H+2][N+1];
ans = INF;
for(int i=0;i<M;i++){
st = new StringTokenizer(br.readLine());
int a,b;
a = Integer.parseInt(st.nextToken());
b = Integer.parseInt(st.nextToken());
arr[a][b] = 1;
arr[a][b+1] = 2;
}
Arrays.fill(arr[H+1],9);
for(int i=0;i<=3;i++){
if(solve(0,1,i)) break;
}
if(ans==INF) ans = -1;
System.out.println(ans);
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2024.02.22 |
---|---|
DFS + DP (๋ฐฑ์ค 1520 ๋ด๋ฆฌ๋ง๊ธธ) (0) | 2024.02.20 |
๋ฐฑํธ๋ํน(14890 ๊ฒฝ์ฌ๋ก) (2) | 2024.02.14 |
BFS (๋ฐฑ์ค 16234 ์ธ๊ตฌ์ด๋) (1) | 2024.02.09 |
๋ ์ง์ ์ด ๋์์, ๋ฒฝ์ ๋ฟ๊ธฐ ์ ๊น์ง ์์ง์ด๋ bfs (๋ฐฑ์ค 13460 ๊ตฌ์ฌํ์ถ2) (1) | 2024.01.21 |