πŸ˜‰/μ½”λ”©ν…ŒμŠ€νŠΈ

[μ•Œκ³ λ¦¬μ¦˜] 였λͺ© (λ°±μ€€, 2615)

ruhz 2022. 1. 25. 16:27

문제

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

 

2615번: 였λͺ©

였λͺ©μ€ λ°”λ‘‘νŒμ— 검은 λ°”λ‘‘μ•Œκ³Ό 흰 λ°”λ‘‘μ•Œμ„ κ΅λŒ€λ‘œ λ†“μ•„μ„œ κ²¨λ£¨λŠ” κ²Œμž„μ΄λ‹€. λ°”λ‘‘νŒμ—λŠ” 19개의 κ°€λ‘œμ€„κ³Ό 19개의 μ„Έλ‘œμ€„μ΄ κ·Έλ €μ Έ μžˆλŠ”λ° κ°€λ‘œμ€„μ€ μœ„μ—μ„œλΆ€ν„° μ•„λž˜λ‘œ 1번, 2번, ... ,19번의 번호

www.acmicpc.net

 

풀이


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

public class Main {
	// * λ°©ν–₯은 μˆœμ„œλŒ€λ‘œ ↓, →, β†˜, β†—
	private static final int[] rowDir = {1, 0, 1, -1};
	private static final int[] colDir = {0, 1, 1, 1};
	private static int[][] board;
	
	// * ν•΄λ‹Ή λ°©ν–₯으둜 λͺ‡ 개의 같은 돌이 μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” ν•¨μˆ˜
	public static int[] countLine(int dir, int r, int c) {
		int prev = -1;
		int[] result = new int[3];
		
		int nr = r;
		int nc = c;
		int count = 0;
		
		while(true) {
			// 01. countκ°€ 5일 λ•Œ, 돌이 λ°”λ€Œμ—ˆκ±°λ‚˜ 끝났닀면 μ°Ύμ•˜λ‹€! (쑰건을 뢄리해 IndexErrorλ₯Ό 방지)
			if(count == 5 && (nr < 0 || nr >= 19 || nc < 0 || nc >= 19)) {
				return result;
			}
			if(count == 5 && board[nr][nc] != prev) {
				return result;
			}
			
			// 02. ν•΄λ‹Ή κ²½μš°κ°€ μ•„λ‹Œλ° λ²”μœ„ λ°–μœΌλ‘œ λ‚˜κ°”λ‹€λ©΄ 해당사항 μ—†λ‹€. 
			if(nr < 0 || nr >= 19 || nc < 0 || nc >= 19) {
				result[0] = -1;
				result[1] = -1;
				result[2] = -1;
				return result;
			}
			
			// 03-1. 빈 칸은 κ·Έλƒ₯ κ±΄λ„ˆλ›°κ³ , λ‹€μ‹œ μ΄ˆκΈ°ν™” ν•΄μ£Όμž.
			if(board[nr][nc] == 0) {
				prev = board[nr][nc];
				count = 0;
			}else {
				// 03-2. 기쑴에 보던 돌과 μ’…λ₯˜κ°€ λ‹€λ₯΄λ‹€λ©΄ μƒˆλ‘­κ²Œ count μ‹œμž‘ν•œλ‹€. 
				if(prev != board[nr][nc]) {
					result[0] = nr+1;
					result[1] = nc+1;
					result[2] = board[nr][nc];
					prev = board[nr][nc];
					count = 1;
				}
				// 03-3. 기쑴에 보던 돌과 μ’…λ₯˜κ°€ κ°™λ‹€λ©΄ countλ₯Ό κ³„μ†ν•œλ‹€. 
				else {
					count ++;
				}
			}
			
			// 04. ν•΄λ‹Ή λ°©ν–₯ λ‹€μŒ λŒμ„ 바라본닀. 
			nr += rowDir[dir];
			nc += colDir[dir];
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		// 00. λ°”λ‘‘νŒμ„ μž…λ ₯ λ°›λŠ”λ‹€.
		board = new int[19][19];
		for(int i = 0; i < 19; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			for(int j = 0; j < 19; j++) {
				board[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		
		// 01. 각 λ°©ν–₯을 κ²€μ‚¬ν•œλ‹€. 
		int[] result;
		
		// ↓ λ°©ν–₯ 일괄검사
		for(int j = 0; j < 19; j++) {
			result = countLine(0, 0, j);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		
		// → λ°©ν–₯ 검사
		for(int i = 0; i < 19; i++) {
			result = countLine(1, i, 0);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		
		// β†˜ λ°©ν–₯ 검사
		for(int j = 0; j < 19; j++) {
			result = countLine(2, 0, j);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		for(int i = 1; i < 19; i++) {
			result = countLine(2, i, 0);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		
		// β†— λ°©ν–₯ 검사
		for(int i = 0; i < 19; i++) {
			result = countLine(3, i, 0);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		for(int j = 1; j < 19; j++) {
			result = countLine(3, 18, j);
			if(result[0] == -1) {
				continue;
			} else {
				System.out.println(result[2]);
				System.out.println(result[0] + " " + result[1]);
				return;
			}
		}
		
		// ν•΄λ‹Ήμ—†λ‹€λ©΄ 0 좜λ ₯!
		System.out.println("0");
	}
}

 

문제λ₯Ό μ ‘ν•˜κ³  두 가지 풀이 쀑 μ–΄λ–€ 것을 선택해야 ν•  지 κ³ λ―Όν•΄λ΄€λ‹€.

  1. λͺ¨λ“  각각의 자리λ₯Ό  κΈ°μ€€μœΌλ‘œ λ„€ λ°©ν–₯ κ²€μ‚¬ν•˜λŠ” 방법
  2. λ°”λ‘‘νŒ 전체λ₯Ό 놓고, ν–‰, μ—΄, λŒ€κ°μ„ μ— μ—°μ†λœ 5κ°œκ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•˜λŠ” 방법

κ΅¬ν˜„μ€ λΉ„μŠ·ν•˜κ²Œ ν’€μ–΄λ³Έ κ²½ν—˜μ΄ μžˆλŠ” λ„€ λ°©ν–₯ νƒμƒ‰μ˜ 1번이 μ‰¬μšΈ 것 κ°™μ•˜μœΌλ‚˜, 2번 방법이 μ„±λŠ₯에 μžˆμ–΄μ„œ 훨씬 효율적이고, 돌의 κ°œμˆ˜μ— 관계없이 μ•ˆμ •μ μ΄λΌκ³  μƒκ°ν–ˆλ‹€. 기본적으둜 같은 λ°©ν–₯에 μžˆμ–΄μ„œ 같은 μ›μ†Œκ°€ μ—¬λŸ¬λ²ˆ 검사 λŒ€μƒμ— μ˜¬λΌκ°€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€. κ·ΈλŸΌμ—λ„ λ§Œμ•½ 1번 λ°©λ²•μœΌλ‘œ 풀이λ₯Ό ν•œλ‹€λ©΄, κ²€μ‚¬ν–ˆλ˜ 뢀뢄을 κ³„μ†ν•΄μ„œ λ‹€μ‹œ 검사해야 ν•˜κΈ° λ•Œλ¬Έμ— 동적 κ³„νšλ²•μ„ μ‚¬μš©ν•΄μ„œ ν’€λ©΄ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμ„ 것 κ°™λ‹€.