Algorithm/λ°±μ€€

λ°±μ€€ 1987번 - μ•ŒνŒŒλ²³

giraffe_ 2022. 8. 18. 23:10

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

 

1987번: μ•ŒνŒŒλ²³

μ„Έλ‘œ RμΉΈ, κ°€λ‘œ C칸으둜 된 ν‘œ λͺ¨μ–‘μ˜ λ³΄λ“œκ°€ μžˆλ‹€. λ³΄λ“œμ˜ 각 μΉΈμ—λŠ” λŒ€λ¬Έμž μ•ŒνŒŒλ²³μ΄ ν•˜λ‚˜μ”© μ ν˜€ 있고, 쒌츑 상단 μΉΈ (1ν–‰ 1μ—΄) μ—λŠ” 말이 놓여 μžˆλ‹€. 말은 μƒν•˜μ’Œμš°λ‘œ μΈμ ‘ν•œ λ„€ μΉΈ μ€‘μ˜ ν•œ 칸으

www.acmicpc.net

 

 

 

 

 

1λ…„ 전에 ν’€μ—ˆμœΌλ‚˜ λͺ¨λ“  ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν†΅κ³Όν•˜μ§€ λͺ»ν•˜μ—¬ μ‹€νŒ¨λ‘œ λ‚¨μ•„μžˆλ˜ λ¬Έμ œμ΄λ‹€. λ‹€μ‹œ ν’€μ—ˆλŠ”λ°λ„ 같은 둜직으둜 μ΄ν•΄ν•˜κ³  ν’€κ²Œ λœλ‹€. λΆ„λͺ… λ§žλŠ” 것 같은데 μ•ˆλ˜λ‹ˆκΉŒ λ‹΅λ‹΅ν•΄μ„œ κ²°κ΅­ μ •λ‹΅ μ½”λ“œμ™€ 계속 λΉ„κ΅ν•œ 끝에 정닡을 λ„μΆœν•΄λ‚Ό 수 μžˆμ—ˆλ‹€.

 

 

 

 

μ½”λ“œ - μ‹€νŒ¨

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

public class Main {
	static int R, C;
	static char[][] graph;
	static boolean[][] visited;
	static ArrayList<Character> letters;
	static int count;
	static int max= 0;
	
	static int[] dx = {1, -1, 0, 0};
	static int[] dy = {0, 0, 1, -1};

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String[] input = br.readLine().split(" ");
		
		R = Integer.parseInt(input[0]);
		C = Integer.parseInt(input[1]);
		
		graph = new char[R + 1][C + 1];
		visited = new boolean[R + 1][C + 1];
		
		for(int i = 1; i <= R; i++) {
			String row = br.readLine();
			
			for(int j = 0; j < C; j++) {
				graph[i][j + 1] = row.charAt(j);
			}
		}
		
		letters = new ArrayList<Character>();
		count = 1;
		dfs(1, 1);
		
		System.out.println(max);
	}

	private static void dfs(int v1, int v2) {
		visited[v1][v2] = true; //정점 λ°©λ¬Έ
		letters.add(graph[v1][v2]);
		
		for(int i = 0; i < 4; i++) { //μƒν•˜μ’Œμš° 탐색
			int nx = v1 + dx[i];
			int ny = v2 + dy[i];
			
			if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //μ’Œν‘œ λ²”μœ„ μ•ˆμ— 있고
				if(!letters.contains(graph[nx][ny]) && !visited[nx][ny]) { //μ§€κΈˆκΉŒμ§€ μ§€λ‚˜μ˜¨ μ•ŒνŒŒλ²³κ³Ό λ‹€λ₯΄κ³ , λ°©λ¬Έx라면
					dfs(nx, ny); //탐색
					count++;
				}
			}
		}
		visited[v1][v2] = false; //정점 λ°©λ¬Έ μ΄ˆκΈ°ν™”!!
		max = Math.max(max, count);
	}

}

 

 

예제 μž…λ ₯ 3번이 μ•ˆλœλ‹€.

5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH

 

 

 

 

 

λ‚˜λŠ” visited[x][y] 배열을 μ‚¬μš©ν•˜μ—¬ μ’Œν‘œμ˜ λ°©λ¬Έ 쀑볡을 막도둝 ν–ˆμ—ˆλ‹€. ν•˜μ§€λ§Œ 이 λ¬Έμ œμ—μ„œλŠ” μ’Œν‘œμ˜ λ°©λ¬Έ 쀑볡을 λ§‰λŠ” 것이 μ•„λ‹ˆλΌ, 문자의 쀑볡을 막아야 ν•œλ‹€. 즉, μ•ŒνŒŒλ²³λ§Œ λ‹€λ₯΄λ‹€λ©΄ 이전에 λ°©λ¬Έν–ˆλ˜ μ’Œν‘œλ₯Ό 후에 방문해도 λœλ‹€.

 

λ”°λΌμ„œ 문자의 λ°©λ¬Έ μ—¬λΆ€λ₯Ό 체크할 26μΉΈ 짜리 배열을 λ§Œλ“€μ–΄μ•Ό ν•œλ‹€. μ•„μŠ€ν‚€ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μ—¬ μΈλ±μŠ€λŠ” 문자 - 'A'둜 ν•΄μ€˜μ•Ό 0λ²ˆλΆ€ν„° λ“€μ–΄κ°€κ²Œ λœλ‹€.

 

그리고 더 이상 νƒμƒ‰ν•˜μ§€ λͺ»ν•˜λ©΄, ν•¨μˆ˜λ₯Ό 끝내기 전에 문자의 λ°©λ¬Έ μ—¬λΆ€λ₯Ό false μ²˜λ¦¬ν•΄μ€˜μ•Ό ν•œλ‹€. 그리고 max 값도 κ°±μ‹ ν•΄μ€€λ‹€. (근데 이 뢀뢄이 계속 μž¬κ·€κ°€ μ’…λ£Œλ  λ•Œλ§ˆλ‹€ ν˜ΈμΆœλœλ‹€.. μ–΄λ–»κ²Œ κ°œμ„ ν•  수 μ—†λ‚˜..?) 

 

 

 

 

 

μ½”λ“œ - 성곡

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

public class b1987 {
	static int R, C;
	static char[][] graph;
	static int[] dx = {-1, 1, 0, 0};
	static int[] dy = {0, 0, -1, 1};
	static boolean[] alphabet;
	static int count;
	static int max;

	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());
		
		graph = new char[R + 1][C + 1];
		
		for(int i = 1; i <= R; i++) {
			String row = br.readLine();
			
			for(int j = 1; j <= C; j++) {
				graph[i][j] = row.charAt(j - 1);
			}
		}
		
		alphabet = new boolean[26];
		count = 1;
		max = 0;
		
		dfs(1, 1, 1);
		
		System.out.println(max);
	}

	public static void dfs(int x, int y, int count) {	
		alphabet[graph[x][y] - 'A'] = true; //μ•ŒνŒŒλ²³ 쀑볡 μ•ˆλ˜κ²Œ 처리
		
		for(int i = 0; i < 4; i++) { //μƒν•˜μ’Œμš° 탐색
			int nx = x + dx[i];
			int ny = y + dy[i];
			
			if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //μ’Œν‘œ λ²”μœ„ μ•ˆμ— 있고
				if(!alphabet[graph[nx][ny] - 'A']) { //μ§€κΈˆκΉŒμ§€ μ§€λ‚˜μ˜¨ μ•ŒνŒŒλ²³κ³Ό λ‹€λ₯΄λ©΄
					dfs(nx, ny, count + 1); //탐색
				}
			}
		}
		
		//탐색 끝남
		alphabet[graph[x][y] - 'A'] = false;
		max = Math.max(max, count);
	}

}

 

 

 

 

 

κ²°κ³Ό