본문 바로가기
알고리즘/백준 문제풀이

[백준 JAVA]16197 두 동전

by 새싹감자 2022. 9. 22.

문제

 


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

 

16197번: 두 동전

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,

www.acmicpc.net

 

 

 

풀이방법


우선 어느쪽으로 갈지 중복순열을 통해서 구해주었다. 10개를 넘으면 -1을 출력하기 때문에, 10개를 뽑아주었다.

	static void perm(int cnt) {
		if(cnt==10) {
			min=Math.min(min, bfs());
			return;
		}
		
		for(int i=0; i<4; i++) {
			num[cnt]=i;
			perm(cnt+1);
		}
	}

그 후에는 뽑아준 방향들로 움직이면서, 경계 밖으로 나가지 않았는지 확인을 해준다.

나는 방향마다 if문을 써서, 

1. 동전두개가 모두 떨어졌다면 그 경우는 답에 포함되면 안되므로 Integer.MAX_VALUE을 리턴

2. 동전 둘중 하나가 떨어졌다면 그 경우는 min을 세줘야 하므로, counttime을 리턴

3. 첫번째 동전이 범위에 포함되고, 벽이 아니라면 움직이기

4. 두번째 동전이 범위에 포함되고, 벽이 아니라면 움직이기

 

로 동전들을 이동해 주었다. 전체 코드는 다음과 같다.

코드


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

public class Main_16197 {

	static char map[][];
	static int num[];
	static int count,M,N;
	static int coin[][];
	static int min=Integer.MAX_VALUE;
	
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		String s;
		N=Integer.parseInt(st.nextToken());
		M=Integer.parseInt(st.nextToken());
		int c=0;
		map= new char[N][M];
		coin= new int[2][2];
		for(int i=0; i<N; i++) {
			s = br.readLine();
			for(int j=0; j<M; j++) {
				map[i][j]=s.charAt(j);
				if(map[i][j]=='o') {
					coin[c][0]=i;
					coin[c][1]=j;
					c++;
				}
			}
		}
		num=new int[10];
		perm(0);
		if(min==Integer.MAX_VALUE) {
			System.out.println(-1);
		}
		else {
			System.out.println(min);	
		}
		
		
	}
	
	static void perm(int cnt) {
		if(cnt==10) {
//			System.out.println(Arrays.toString(num));
			min=Math.min(min, bfs());
			return;
		}
		
		for(int i=0; i<4; i++) {
			num[cnt]=i;
			perm(cnt+1);
		}
	}
	static int bfs() {
		int fx=coin[0][0];
		int fy=coin[0][1];
		int sx=coin[1][0];
		int sy=coin[1][1];
		
		int counttime=0;
		
		for(int i=0; i<10; i++) {
			counttime++;
			if(num[i]==0) {
				if(fx-1<0 && sx-1<0) {
					return Integer.MAX_VALUE;
				}
				if(fx-1<0 || sx-1<0) {
					return counttime;
				}
				if(fx-1>=0 && map[fx-1][fy]!='#') {
					fx=fx-1;
				}
				if(sx-1>=0 && map[sx-1][sy]!='#') {
					sx=sx-1;
				}
			}
			if(num[i]==1) {
				if(fy+1>=M && sy+1>=M) {
					return Integer.MAX_VALUE;
				}
				if(fy+1>=M || sy+1>=M) {
					return counttime;
				}
				if(fy+1<M && map[fx][fy+1]!='#') {
					fy=fy+1;
				}
				if(sy+1<M && map[sx][sy+1]!='#') {
					sy=sy+1;
				}
			
			}
			if(num[i]==2) {
				if(fx+1>=N && sx+1>=N) {
					return Integer.MAX_VALUE;
				}
				if(fx+1>=N || sx+1>=N) {
					return counttime;
				}
				if(fx+1<N && map[fx+1][fy]!='#') {
					fx=fx+1;
				}
				if(sx+1<N && map[sx+1][sy]!='#') {
					sx=sx+1;
				}
				
			}
			if(num[i]==3) {
				if(fy-1<0 && sy-1<0) {
					return Integer.MAX_VALUE;
				}
				if(fy-1<0 || sy-1<0) {
					return counttime;
				}
				if(fy-1>=0 && map[fx][fy-1]!='#') {
					fy=fy-1;
				}
				if(sy-1>=0 && map[sx][sy-1]!='#') {
					sy=sy-1;
				}
				
			}
		}
		return Integer.MAX_VALUE;
	}

}
 
 

'알고리즘 > 백준 문제풀이' 카테고리의 다른 글

[백준 Java]14620 꽃길  (0) 2022.10.23
[백준 Java] 주사위 굴리기 2  (1) 2022.09.19
[백준 JAVA] N과 M(1~6)  (0) 2022.09.18
[백준 JAVA] 10826 피보나치 수4  (0) 2022.09.18
[백준 JAVA] 17406 배열 돌리기 4  (0) 2022.09.18

댓글