본문 바로가기

[Algorithms]/[Problems]

BOJ. 2615번. 오목

728x90

 

요즘 SSAFY과정을 들으면서 Java언어에 익숙해지기 위해, 다양한 알고리즘 문제를 Java로 풀이하는 연습을 하고 있다.

2주전쯤 풀었던 문제인데, 지금 보니 입출력등 미숙해 보이는 부분이 많다;;

www.acmicpc.net/problem/2615

 

2615번: 오목

오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호

www.acmicpc.net

2615번 오목 문제는 차례로 NxN matrix의 좌표를 순서대로 접근하면서, 5목이라면 좌표상 가장 왼쪽 바둑돌을 출력하면 되는 간단한 문제다. case를 나누어 풀면 해결할 수 있지만, 발생가능한 예외(6목, 왼쪽 출력)을 잘 생각하는 것이 중요하다. 다른 풀이들을 보면 dfs를 활용한 풀이도 꽤 눈에 띄고, 생략가능한 오목은 지나치는 방법으로 코드 길이를 확연히 줄인 코드들도 인상깊었다. 

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
	
	// data input
	public static void dataInput(int[][] omock) throws Exception{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		for(int i=0; i < 19; i++) {
			String[] str = bf.readLine().split(" ");
			for(int j=0; j < 19; j++) {
				omock[i][j] = Integer.parseInt(str[j]);	
			}
		}
	}
	
	// 왼쪽 상단부터 차례로 탐색
	public static int checkIfThisWin(int[][] omock, int px, int py) {
		boolean ans = true;
		int target = omock[px][py];
		
		// case 1 ㅡ
		for(int i=1; i<5; i++) {
			if(py+i>18 || omock[px][py+i] != target) {
				ans = false;
				break;
			}
		}
		if(py-1>-1 && omock[px][py-1] == target) { ans = false;}
		if(py+5<19 && omock[px][py+5] == target) { ans = false;}
//		System.out.println("1");
		if (ans) return 1;
		
		// case 2 |
		ans = true;
		for(int i=1; i<5; i++) {
			if(px+i>18 || omock[px+i][py] != target) {
				ans = false;
				break;
			}
		}
		if(px-1>-1 && omock[px-1][py] == target) { ans = false;}
		if(px+5<19 && omock[px+5][py] == target) { ans = false;}
//		System.out.println("2");
		if (ans) return 2;
		
		// case 3 /
		ans = true;
		for(int i=1; i<5; i++) {
			if(px+i>18 || py-i<0 || omock[px+i][py-i] != target) {
				ans = false;
				break;
			}
		}
		if(px-1>-1 && py+1<19 && omock[px-1][py+1] == target) { ans = false; }
		if(px+5<19 && py-5>-1 && omock[px+5][py-5] == target) { ans = false; }
//		System.out.println("3");
		if (ans) return 3;
		
		// case 4 \
		ans = true;
		for(int i=1; i<5; i++) {
			if(px+i>18 || py+i>18 || omock[px+i][py+i] != target) {
				ans = false;
				break;
			}
		}
		if(px-1>-1 && py-1>-1 && omock[px-1][py-1] == target) { ans = false;}
		if(px+5<19 && py+5<19 && omock[px+5][py+5] == target) { ans = false;}
//		System.out.println("4");
		if (ans) return 4;
		
		return 5;
	}
	
	public static void main(String[] args) throws Exception {
		
		// 19 x 19
		int[][] omock = new int[19][19];
		int backcase = 0;
		dataInput(omock);
		for(int i=0; i<19; i++) {
			for(int j=0; j<19; j++) {
				if( omock[i][j] != 0) {
					backcase = checkIfThisWin(omock, i, j);
					if(backcase == 1 || backcase == 2 || backcase == 4) {
						System.out.println(omock[i][j]);
						System.out.printf("%d %d", i+1, j+1);
						System.exit(0);
					}else if(backcase == 3) {
						System.out.println(omock[i][j]);
						System.out.printf("%d %d", i+5, j-3);
						System.exit(0);
					}
					
				}
			}
		}
		
		System.out.println(0);
	}
	
}

 

728x90

'[Algorithms] > [Problems]' 카테고리의 다른 글

BOJ. 17406번. 배열 돌리기 4  (0) 2021.02.14
BOJ. 16935번. 배열 돌리기 3  (0) 2021.02.14
BOJ. 16927번. 배열 돌리기 2  (0) 2021.02.14
BOJ. 16926번. 배열 돌리기 1  (0) 2021.02.14
BOJ. 10799번. 쇠막대기  (0) 2021.02.14