백준 2615 오목 JAVA

hyeon·2022년 4월 12일
0

알고리즘 연습

목록 보기
1/23

문제 링크

2615 오목
실버 2
브루트포스, 구현

풀이

처음엔 입력받는 for문에서 바로 탐색을 시작했으니 당연히 입력안받은 부분은 다 0이여서 답이 안나옴
두번째로는 바둑알이 6개 이상일때의 예외처리를 안해서 틀림
자잘자잘한 오류를 고치고
세번째로 처음 바둑알을 찾은곳을 출력하는 방식으로 풀었지만 그렇게 하면 ↙이모양일때 맨오른쪽위가 출력되게된다 그래서 8개의 화살표를 다돌리는게 아니라 (↗ → ↘ ↓) 얘들만 돌려서 찾았다.
5시간의 대장정을 끝으로 정답처리 됐다.....ㅎ
실버 2 쉽지않군!

  1. [main] 바둑알을 찾는다.
  2. [check] (↗ → ↘ ↓) 순으로 이전 바둑알과 같은 색갈을 가진지 확인한다.
  3. [check2] check에서 정해진 방향으로 다른색갈이 나올때까지 탐색하고 몇개인지 저장
  4. [check] count가 6이상이면 넘기고 5이면 6개이상인지 확인한다
  5. [check3] 탐색한 방향의 반대방향에 똑같은 색갈의 바둑이 있는지 확인한다.

코드 (java)

package algorithm;

import java.util.*;
import java.io.*;

public class Main {
    static Scanner scan=new Scanner(System.in);
    static int[][] arr;
    //↑ (↗ → ↘  ↓)  ↙    ←    ↖     순서 
    static int[] dx={-1,-1,0,1,1,1,0,-1};
    static int[] dy={0,1,1,1,0,-1,-1,-1};
    static int black,white;
    static int cnt,count;
    static boolean flag;
    public static void main(String args[]) {
        arr=new int[19][19];
        for(int i=0;i<19;i++){
            for(int j=0;j<19;j++){
            arr[i][j]=scan.nextInt();
            }
        }
        for(int i=0;i<19;i++) {
        	for(int j=0;j<19;j++) {
                if(arr[i][j]!=0){
                    if(flag==false){
                    check(i,j);
                    }
                }
        	}
        }
        //다 돌았을때까지 flag false이면
        if(flag==false){
            System.out.print(0);
        }
    }
    
    static void check(int a, int b){
        for(int i=1;i<=4;i++){   //모든 방향 탐색
            int nx=a+dx[i];
            int ny=b+dy[i];
            if(a+dx[i]>=0&&a+dx[i]<19&&b+dy[i]>=0&&b+dy[i]<19){       //판을 벗어나지 않는다면

                if(arr[nx][ny]==arr[a][b]){ //이전 바둑알 색갈과 같은것이 있다면
                    cnt=2;
                    check2(i,nx,ny);
                    if(cnt==5){
                    boolean chk=check3(i,a,b);
                    if(chk==true) {
                       if(arr[a][b]==1){
                           System.out.println(1);
                           int c=a+1;
                           int d=b+1;
                           System.out.print(c+" "+d);        
                           flag=true;
                           break;
                       } 
                       else if (arr[a][b]==2){
                           System.out.println(2);
                           int c=a+1;
                           int d=b+1;
                           System.out.print(c+" "+d);
                           flag=true;
                           break;
                       }
                    }
                    }
                    else if(cnt>5) {
                    	break;
                    }
                }
            }
        }
        return;
    }
    static void check2(int dir,int a, int b){    //방향 좌표 몇개인지 입력받음
        int nx=a+dx[dir];
        int ny=b+dy[dir];
		if(nx>=0&&nx<19&&ny>=0&&ny<19) {
        if(arr[nx][ny]==arr[a][b]){
            cnt++;
            check2(dir,nx,ny);
        }
        }
        
    }
    static boolean check3(int dir, int a, int b) {
    	 
    	if(dir==0||dir==1||dir==2||dir==3) {

    		int nx=a+dx[dir+4];
    		int ny=b+dy[dir+4];
    		if(nx>=0&&nx<19&&ny>=0&&ny<19) {
	    		if(arr[nx][ny]==arr[a][b]) {
	    			return false;
	    		}
	    		else return true;

    		}	
    	}

      	else if(dir==4||dir==5||dir==6||dir==7) {
      		int nx=a+dx[dir-4];
    		int ny=b+dy[dir-4];
      		if(nx>=0&&nx<19&&ny>=0&&ny<19) {
      		if(arr[nx][ny]==arr[a][b]) {
    			return false;
    		}
    		else return true;

      		}
      
      	}
    	return true;
    }
    
    
}
profile
남기고 싶은 개발자입니다 :>

0개의 댓글