BOJ_1987_알파벳

2021. 8. 19. 17:44백준 알고리즘(BOJ)

1.

구분: 백트래킹, DFS, BFS, 그래프 탐색

언어: Java

전략:

  • DFS로 탐색을 하는데, 특정 조건에 대해 pruning과정을 진행한다. 
  • 특정 조건은 이미 방문한 경우이다(알파벳 중복 방지) 
  • 알파벳을 방문 처리를 하고, 재귀를 부르고, 그 후에 다시 방문 해지를 해야 한다. 

  • 2. 코드
package com.ssafy.hw;

import java.util.Scanner;

public class BOJ_1987 {

	static int r, c, cnt;
	static char[][] map;
	static boolean[] check;
	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		r= scanner.nextInt();
		c = scanner.nextInt();
		map = new char[r][c];
		for(int i = 0; i<r; i++) {
			String str = scanner.next();
			for(int j = 0; j<c; j++) {
				map[i][j] = str.charAt(j);
			}
		}
        //알파벳의 방문여부를 체크하는 배열
		check = new boolean[26];
		max = -1;
		move(0,0,1);
		
		System.out.println(max);
		

	}//main
	
	static int max;
	//A-17     map[y][x]-'0'-17이 인덱스 A가 인덱스 0
	private static void move(int y, int x, int cnt) {
	
		//-'A'를 뺴면 내가 원하는 값을 얻을 수 있다. 
		int index = map[y][x] -'0'-17;
        //이 부분은 맨 처음을 위한 부분 - 위로 옮겨도 될듯
		check[index] = true;
		
		//만약 전체를 다 돌아서 이미 넘어버리면 그만해 
		//필요가 없다 이미 다 돌아서 이미 없으니까 아래에서 재귀가 호출되지 않는다
		if(cnt>r*c) {
			return;
		}
		
		
		max = cnt>=max? cnt:max;
		
		
		//4방탐색
		for(int i = 0; i<4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			//범위 벗어나면
			if(nx<0 || ny<0|| nx>=c|| ny>=r) continue;
			//이미 방문하면 
			int idx = map[ny][nx] -'0'-17;
			if(check[idx]) continue;
			
			check[idx] = true;
			move(ny, nx, cnt+1);
			check[idx] = false;
		}
		
	}//move
	
	static int[] dx = {1,-1,0,0};
	static int[] dy = {0,0,1,-1};

}

3.

  • index를 구하는 과정이 번거롭다 -> map[i][j] - 'A'를 통해 내가 원하는 값을 얻을 수 있다. 
  • move함수에서 cnt가 전체 알파벳 개수보다 큰 경우는 고려하지 않아도 된다. 왜냐하면 이미 이 경우에 방문 처리가 되어있으니 어차피 밑에서 재귀가 불릴 수 없다. (단! 이 문제만 이러하지 다른 문제는 또 다를 수 있다.)

'백준 알고리즘(BOJ)' 카테고리의 다른 글

BOJ_7568_덩치  (0) 2021.09.01
BOJ_17070_파이프 옮기기1  (0) 2021.08.20
BOJ_2468_안전영역  (0) 2021.08.18
BOJ_2667_단지번호 붙이기  (0) 2021.08.18
BOJ_15686_치킨 배달  (0) 2021.08.13