λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm

[λ°±μ€€] 1051번: 숫자 μ •μ‚¬κ°ν˜•(μ™„μ „ 탐색, κ΅¬ν˜„)

by 주발2 2020. 3. 3.
λ°˜μ‘ν˜•

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

 

1051번: 숫자 μ •μ‚¬κ°ν˜•

N*M크기의 μ§μ‚¬κ°ν˜•μ΄ μžˆλ‹€. 각 칸은 ν•œ 자리 μˆ«μžκ°€ μ ν˜€ μžˆλ‹€. 이 μ§μ‚¬κ°ν˜•μ—μ„œ 꼭짓점에 μ“°μ—¬ μžˆλŠ” μˆ˜κ°€ λͺ¨λ‘ 같은 κ°€μž₯ 큰 μ •μ‚¬κ°ν˜•μ„ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. μ΄λ•Œ, μ •μ‚¬κ°ν˜•μ€ ν–‰ λ˜λŠ” 열에 평행해야 ν•œλ‹€.

www.acmicpc.net

ν‹€λ¦°μ½”λ“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		int M = scan.nextInt();
		int[][] arr = new int[N][M];
		int max = 0;
		int row = 0;
		int col = 0;
		boolean flag = true;
		
		// 2차원 배열에 κ°’ λ„£κΈ°
		for(int i=0; i<N; i++) {
			String str = scan.next();
			for(int j=0; j<M; j++) {
				arr[i][j] = str.charAt(j) - '0';
			}
		}
		
		/*
		 * 1x1 , 2x2 , 3x3 , ... κ°€λŠ₯ν•œ λͺ¨λ“  μ •μ‚¬κ°ν˜•μ„ μ™„μ „ νƒμƒ‰μœΌλ‘œ μ°ΎλŠ”λ‹€.
		 */
		while(true) {
			int area = 0;
			if(!flag)
				break;
			
			for(int i=0; i<N-1; i++) {
				for(int j=0; j<M-1; j++) {
					
					// 비ꡐ할 수 μžˆλŠ” κ°€λ‘œ λ˜λŠ” μ„Έλ‘œμ˜ 꼭짓점이 λ°°μ—΄μ˜ 크기λ₯Ό λ²—μ–΄λ‚œ 경우
					if(row + i >=N || col + j >= M) {
						flag = false;
						break;
					}
					
					/*
					 * λ„€ 개의 꼭짓점이 μ •μ‚¬κ°ν˜•μ„ 이루고 꼭짓점에 μ“°μ—¬μžˆλŠ” μˆ˜κ°€ 같을 λ•Œ,
					 * A B 
					 * C D 
					 * μœ„ 4κ°œμ—μ„œ, A = B && A = C && A = D 이면 4개의 μˆ˜κ°€ κ°™λ‹€κ³  νŒλ‹¨.
					 */
					if(arr[i][j] == arr[i][j+col] && arr[i][j] == arr[i+row][j] && arr[i][j] == arr[i+row][j+col]) {
						// ν•œλ³€μ˜ 길이 = 두 점의 μ’Œν‘œλ₯Ό λΊ€ ν›„ +1을함, (0,2) (0,4)의 길이 => 3
						int width = (Math.abs(j-i)) + 1;
						area = width * width;
					}
				}
			}
			
			max = Math.max(max, area);
			row ++;
			col ++;
		}
		System.out.println(max);
		scan.close();
	}

}

풀이

 

처음 λ¬Έμ œμ—μ„œ N, M의 λ²”μœ„κ°€ 50κΉŒμ§€λ°–μ— μ•ˆλ˜μ„œ μ™„μ „νƒμƒ‰μœΌλ‘œ 해도 μΆ©λΆ„νžˆ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚  것 같지 μ•Šμ•„μ„œ 

μ •μ‚¬κ°ν˜•μ΄ 1x1λΆ€ν„° μ‹œμž‘ν•΄μ„œ κ°€μž₯ 큰 μ •μ‚¬κ°ν˜• nxn κΉŒμ§€ 비ꡐ해가며 4개의 꼭짓점이 κ°™μ€μˆ˜λ₯Ό μ°Ύκ³ , κ°€μž₯ 큰 넓이λ₯Ό κ΅¬ν•˜λ„λ‘ μƒκ°ν•˜κ³  μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλŠ”λ°, μœ„ μ½”λ“œλŠ” ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ§Œ ν†΅κ³Όν•˜κ³  ν‹€λ Έλ‹€κ³  λ‚˜μ˜¨λ‹€.

λ„μ €νžˆ λ– μ˜€λ₯΄μ§€κ°€ μ•Šμ•„μ„œ 타 λΈ”λ‘œκ·Έλ“€μ„ μ°Έκ³ ν–ˆλ‹€.

 

μ΅œμ’… μ½”λ“œ

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		int M = scan.nextInt();
		int[][] arr = new int[N][M];
		final int MIN = Math.min(N, M);
		int area = 0;
		int maxArea = 0;
		
		// 2차원 배열에 κ°’ λ„£κΈ°
		for(int i=0; i<N; i++) {
			String str = scan.next();
			for(int j=0; j<M; j++) {
				arr[i][j] = str.charAt(j) - '0';
			}
		}
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				for(int k=0; k<MIN; k++) {
					if(i+k < N && j+k < M) {	// λ°°μ—΄ λ²”μœ„ 이내
						
						// 4개의 꼭짓점이 μ •μ‚¬κ°ν˜•μ΄ λ˜λŠ” 쑰건
						if(arr[i][j] == arr[i][j+k] && arr[i][j] == arr[i+k][j] && arr[i][j] == arr[i+k][j+k]) {
							area = (k+1) * (k+1);
							maxArea = Math.max(maxArea, area);
						}
					}
				}
			}
		}
		
		System.out.println(maxArea);
		scan.close();
	}

}

풀이

λ¨Όμ € 주어진 N, M 쀑 더 큰값을 μ°ΎλŠ”λ‹€.

λ¬Έμ œμ—μ„œ 3 x 5둜 주어진 경우, μ΅œλŒ€λ‘œ κ°€λŠ₯ν•œ μ •μ‚¬κ°ν˜•μ€ 3 x 3μ΄λ―€λ‘œ, 더 μž‘μ€ 3κΉŒμ§€λ§Œ λ°˜λ³΅ν•˜λ©΄ 되기 λ•Œλ¬Έμ΄λ‹€.

area = 4개의 꼭짓점이 μ •μ‚¬κ°ν˜•μΌλ•Œ, 넓이λ₯Ό κ΅¬ν•˜λŠ” λ³€μˆ˜κ³ 

maxArea = μœ„ area와 λΉ„κ΅ν•΄μ„œ 더 큰값을 μ €μž₯ν•˜κ³ , μ΅œμ’…μ μœΌλ‘œ 좜λ ₯ν•  λ³€μˆ˜λ‹€.

i+k 와 j+kκ°€ 각각 M, N 보닀 μž‘μ•„μ•Ό λ°°μ—΄μ˜ λ²”μœ„ 이내라고 ν•  수 μžˆλ‹€.

4개의 꼭짓점이 같을 쑰건은 3개의 κΌ­μ§“μ λ§Œ 확인해주면 λœλ‹€.

(0,0) , (0,1)

(1,0) , (1,1)

μœ„μ™€ 같이 4개의 점이 μžˆμ„λ•Œ, A = B && A = C && A = D 이면 μžλ™μ μœΌλ‘œ B = C = D κ°€ 보μž₯되기 λ•Œλ¬Έμ΄λ‹€.

λ˜ν•œ 4개의 점을 μ°ΎκΈ° μœ„ν•΄ 인덱슀λ₯Ό μ‘°μž‘ν•΄μ•Όν•˜λŠ”λ°, ν–‰κ³Ό μ—΄, 행열에 각각 kλ₯Ό λ”ν•˜λ©΄ μΌμ •ν•œ 4개의 꼭짓점이 λœλ‹€.

 

 

 

* λ­”κ°€ μ‹œκ°„λ³΅μž‘λ„μ— λŒ€ν•΄ μ•½κ°„(?)은 감이 μž‘νžˆλŠ” 것 κ°™λ‹€.

μœ„ 문제의 κ²½μš°λ„ O(n^3) μ΄μ§€λ§Œ, 각각의 λ²”μœ„λŠ” 50μ΄λ―€λ‘œ 50^3 으둜 μΆ©λΆ„ν•œ μ‹œκ°„μΈ 것 κ°™λ‹€.

보톡 1μ΄ˆλ‹Ή 반볡문 μˆ˜ν–‰ νšŸμˆ˜κ°€ 1얡을 λ„˜μ–΄κ°€λ©΄ μ‹œκ°„ μ œν•œμ„ μ΄ˆκ³Όν•  κ°€λŠ₯성이 μžˆλ‹€κ³  ν•œλ‹€.

λ°˜μ‘ν˜•

λŒ“κΈ€