728x90
요즘 SSAFY과정을 들으면서 Java언어에 익숙해지기 위해, 다양한 알고리즘 문제를 Java로 풀이하는 연습을 하고 있다.
2주전쯤 풀었던 문제인데, 지금 보니 입출력등 미숙해 보이는 부분이 많다;;
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 |