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

[λ°±μ€€] 3085번: 사탕 κ²Œμž„(μ™„μ „ 탐색)

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

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

 

3085번: 사탕 κ²Œμž„

문제 μƒκ·Όμ΄λŠ” 어렸을 적에 "λ΄„λ³΄λ‹ˆ (Bomboni)" κ²Œμž„μ„ μ¦κ²¨ν–ˆλ‹€. κ°€μž₯ μ²˜μŒμ— N×N크기에 사탕을 μ±„μ›Œ λ†“λŠ”λ‹€. μ‚¬νƒ•μ˜ 색은 λͺ¨λ‘ 같지 μ•Šμ„ μˆ˜λ„ μžˆλ‹€. μƒκ·Όμ΄λŠ” μ‚¬νƒ•μ˜ 색이 λ‹€λ₯Έ μΈμ ‘ν•œ 두 칸을 κ³ λ₯Έλ‹€. κ·Έ λ‹€μŒ κ³ λ₯Έ 칸에 λ“€μ–΄μžˆλŠ” 사탕을 μ„œλ‘œ κ΅ν™˜ν•œλ‹€. μ΄μ œ, λͺ¨λ‘ 같은 μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ” κ°€μž₯ κΈ΄ 연속 λΆ€λΆ„(ν–‰ λ˜λŠ” μ—΄)을 κ³ λ₯Έ λ‹€μŒ κ·Έ 사탕을 λͺ¨λ‘ λ¨ΉλŠ”λ‹€. 사탕이 μ±„μ›Œμ§„ μƒνƒœκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 상근이가 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 개수λ₯Ό κ΅¬ν•˜

www.acmicpc.net

μ½”λ“œ

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static char[][] board;	// 맡 크기
	public static int N;			// 맡 크기
	public static int max = 0;		// 먹을 수 μžˆλŠ” μ΅œλŒ€ μ‚¬νƒ•κ°œμˆ˜
	
	/* 두 문자 κ΅ν™˜ν•˜λŠ” λ©”μ†Œλ“œ */
	public static void swap(char a, char b) {
		char temp = a;
		a = b;
		b = temp;
	}
	
	/* κ°€λ‘œλ‘œ, μ„Έλ‘œλ‘œ λΉ„κ΅ν•˜λ©΄μ„œ 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€ 갯수 μ°ΎκΈ° */
	public static void arrCheck() {
		
		// → κ°€λ‘œλ‘œ 체크
		for(int i=0; i<N; i++) {
			int count = 1;
			for(int j=0; j<N-1; j++) {
				
				// 이전 사탕과 λ™μΌν•œ 경우 -> 계속 λ¨ΉλŠ”λ‹€
				if(board[i][j] == board[i][j+1])
					count ++;
				
				// 이전과 λ‹€λ₯Έ 사탕인 경우 -> μƒˆλ‘œ λ¨Ήμ–΄μ•Όν•˜λ―€λ‘œ 1둜 μ΄ˆκΈ°ν™”
				else 
					count = 1;
				
				// 사탕 μ΅œλŒ€ 개수 μ €μž₯
				max = Math.max(max, count);
			}
		}
		
		// ↓ μ„Έλ‘œλ‘œ 체크
		for(int i=0; i<N; i++) {
			int count = 1;
			for(int j=0; j<N-1; j++) {
				if(board[j][i] == board[j+1][i])
					count ++;
				else 
					count = 1;
				max = Math.max(max, count);
			}
		}
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt();	// λ³΄λ“œμ˜ 크기
		board = new char[N][N];
		
		/* N x N 사탕 μž…λ ₯λ°›κΈ° */
		for(int i=0; i<N; i++) {
			String str = scan.next();
			for(int j=0; j<board[i].length; j++) {
				board[i][j] = str.charAt(j);
			}
		}
		
		/* κ°€λ‘œλ‘œ μΈμ ‘ν•œ 두 사탕 κ΅ν™˜ν•˜κ³  μ΅œλŒ€ 사탕 개수 μ°Ύκ³  μ›μœ„μΉ˜ */
		for(int i=0; i<N; i++) {
			for(int j=0; j<N-1; j++) {
				// κ°€λ‘œλ‘œ μΈμ ‘ν•œ 두 문자 κ΅ν™˜
				//swap(board[i][j], board[i][j+1]);
				char temp = board[i][j];
				board[i][j] = board[i][j+1];
				board[i][j+1] = temp;
				
				// →, ↓ 체크
				arrCheck();
				
				// 이전에 κ΅ν™˜ν•œ 문자 볡ꡬ
				//swap(board[i][j], board[i][j+1]);
				temp = board[i][j];
				board[i][j] = board[i][j+1];
				board[i][j+1] = temp;
			}
		}
		
		/* μ„Έλ‘œλ‘œ μΈμ ‘ν•œ 두 사탕 κ΅ν™˜ν•˜κ³  μ΅œλŒ€ 사탕 개수 μ°Ύκ³  μ›μœ„μΉ˜ */
		for(int i=0; i<N; i++) {
			for(int j=0; j<N-1; j++) {
				//swap(board[j][i], board[j+1][i]);
				
				char temp = board[j][i];
				board[j][i] = board[j+1][i];
				board[j+1][i] = temp;
				
				// →, ↓ 체크
				arrCheck();
				
				// 이전에 κ΅ν™˜ν•œ 문자 볡ꡬ
				//swap(board[j][i], board[j+1][i]);
				temp = board[j][i];
				board[j][i] = board[j+1][i];
				board[j+1][i] = temp;
			}
		}
		
		System.out.println(max);
		scan.close();
	}

}

풀이

λ¬Έμ œμ—μ„œ 주어진 쑰건에따라 κ·ΈλŒ€λ‘œ~ μ™„μ „ 탐색을 톡해 κ΅¬ν˜„ν•˜λ©΄ λœλ‹€.

λ‚˜λŠ” 계속 λ§žμ•˜λ‹€κ³  μƒκ°ν–ˆλŠ”λ° μ‹€μ œμΆœλ ₯ 결과값은 λ‹¬λΌμ„œ 계속 보닀가... swap() ν•¨μˆ˜μ˜ λ¬Έμ œμ˜€λ‹€.

값을 κ΅ν™˜μ„ ν•΄μ•Όν•˜λŠ”λ°, μ €λŸ°μ‹μœΌλ‘œ ν•¨μˆ˜μ•ˆμ—μ„œ 값을 κ΅ν™˜ν•œλ‹€κ³  해도, μ‹€μ œλ‘œλŠ” κ°’μ˜ κ΅ν™˜μ΄ 이뀄지지 μ•ŠλŠ”λ‹€.

즉 Call By Value이냐 Call By Reference μ΄λŠλƒμ— 따라 차이인데, Cμ—μ„œλŠ” ν¬μΈν„°λ‘œ κ΅ν™˜μ„ ν•  수 μžˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒμ„ μ°Έκ³ ν•˜μž.

 

Java Call By

 

무튼 문제둜 λŒμ•„μ™€μ„œ ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™λ‹€.

 

N*N 크기가 μ£Όμ–΄μ‘Œμ„λ•Œ, μΈμ ‘ν•œ 두 칸을 κ³ λ₯΄κ³  값을 κ΅ν™˜ν•΄μ„œ κ°™μ€μƒ‰μœΌλ‘œ 이루어져 μžˆλŠ”(κ°€μž₯ κΈ΄ 연속뢀뢄, ν–‰ or μ—΄)을 κ³ λ₯Έ λ‹€μŒ κ·Έ 사탕을 λͺ¨λ‘ λ¨ΉλŠ”λ° μ΅œλŒ“κ°’μ„ ꡬ해야 ν•œλ‹€.

 

λ¨Όμ € μΈμ ‘ν•œ 칸이 κ°€λ‘œλ‘œ μΈμ ‘ν•œ 두 λ¬ΈμžλΆ€ν„° κ΅ν™˜ν•˜κ³ , arrCheck() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ λ‹€μ‹œ κ΅ν™˜ν•œ 두 값을 μ›λž˜μƒνƒœλ‘œ λ³΅κ΅¬ν•œλ‹€(λ‹€μ‹œ κ΅ν™˜)

 

κ·Έ ν›„ μΈμ ‘ν•œ 칸이 μ„Έλ‘œλ‘œ μΈμ ‘ν•œ 두 λ¬Έμžλ„ κ΅ν™˜ν•˜κ³ , arrCheck() λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ ν›„ λ‹€μ‹œ κ΅ν™˜ν•œ 두 값을 μ›λž˜μƒνƒœλ‘œ λ³΅κ΅¬ν•œλ‹€(λ‹€μ‹œ κ΅ν™˜)

 

* arrCheck()

μœ„ λ©”μ†Œλ“œλŠ” κ°€λ‘œ(→) λ°©ν–₯κ³Ό μ„Έλ‘œ(↓) λ°©ν–₯을 λŒλ©΄μ„œ 먹을 수 μžˆλŠ” μ‚¬νƒ•μ˜ μ΅œλŒ€κ°―μˆ˜(κ°€μž₯ κΈ΄ 연속뢀뢄)λ₯Ό μ°ΎλŠ” λ©”μ†Œλ“œλ‹€.

 

 

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€