본문 바로가기

Java/Java 알고리즘 SWEA

[SW 아카데미] 4615. 재미있는 오셀로 게임

반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?problemLevel=3&contestProbId=AWQmA4uK8ygDFAXj&categoryId=AWQmA4uK8ygDFAXj&categoryType=CODE&problemTitle=&orderBy=RECOMMEND_COUNT&selectCodeLang=JAVA&select-1=3&pageSize=30&pageIndex=1 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

1. 현재 위치에서 가까운 다른 돌 체크

2. 현재 위치에서 가까운 같은 돌 체크

3. 현재 위치에서 가까운 같은 돌부터 가까운 다른 돌 모두 같은 돌로 변경

4. 배열 인덱스 범위 체크하는 메서드와 다른 돌 변경하는 메서드 작성해서 사용

 

/////////////////////////////////////////////////////////////////////////////////////////////
// 기본 제공코드는 임의 수정해도 관계 없습니다. 단, 입출력 포맷 주의
// 아래 표준 입출력 예제 필요시 참고하세요.
// 표준 입력 예제
// int a;
// double b;
// char g;
// String var;
// long AB;
// a = sc.nextInt();                           // int 변수 1개 입력받는 예제
// b = sc.nextDouble();                        // double 변수 1개 입력받는 예제
// g = sc.nextByte();                          // char 변수 1개 입력받는 예제
// var = sc.next();                            // 문자열 1개 입력받는 예제
// AB = sc.nextLong();                         // long 변수 1개 입력받는 예제
/////////////////////////////////////////////////////////////////////////////////////////////
// 표준 출력 예제
// int a = 0;
// double b = 1.0;
// char g = 'b';
// String var = "ABCDEFG";
// long AB = 12345678901234567L;
//System.out.println(a);                       // int 변수 1개 출력하는 예제
//System.out.println(b); 		       						 // double 변수 1개 출력하는 예제
//System.out.println(g);		       						 // char 변수 1개 출력하는 예제
//System.out.println(var);		       				   // 문자열 1개 출력하는 예제
//System.out.println(AB);		       				     // long 변수 1개 출력하는 예제
/////////////////////////////////////////////////////////////////////////////////////////////
import java.util.ArrayList;
import java.util.Scanner;
import java.io.FileInputStream;

/*
   사용하는 클래스명이 Solution 이어야 하므로, 가급적 Solution.java 를 사용할 것을 권장합니다.
   이러한 상황에서도 동일하게 java Solution 명령으로 프로그램을 수행해볼 수 있습니다.
 */
class Point{
    public int x,y;
    Point(int x, int y){
        this.x=x;
        this.y=y;
    }
}
class Solution
{

    static int N,M;
    static int[][] arr;
    static int Bcount, Wcount;
    public static void main(String args[]) throws Exception
    {
		/*
		   아래의 메소드 호출은 앞으로 표준 입력(키보드) 대신 input.txt 파일로부터 읽어오겠다는 의미의 코드입니다.
		   여러분이 작성한 코드를 테스트 할 때, 편의를 위해서 input.txt에 입력을 저장한 후,
		   이 코드를 프로그램의 처음 부분에 추가하면 이후 입력을 수행할 때 표준 입력 대신 파일로부터 입력을 받아올 수 있습니다.
		   따라서 테스트를 수행할 때에는 아래 주석을 지우고 이 메소드를 사용하셔도 좋습니다.
		   단, 채점을 위해 코드를 제출하실 때에는 반드시 이 메소드를 지우거나 주석 처리 하셔야 합니다.
		 */

		/*
		   표준입력 System.in 으로부터 스캐너를 만들어 데이터를 읽어옵니다.
		 */
        Scanner sc = new Scanner(System.in);
        int T;
        T=sc.nextInt();
		/*
		   여러 개의 테스트 케이스가 주어지므로, 각각을 처리합니다.
		*/

        for(int test_case = 1; test_case <= T; test_case++)
        {
            //보드에 공간이 없거나, 양 플레이어 모두 돌을 놓을 곳이 없을 때 -> 돌의 개수가 많은 플레이어 승으로 종료
            //종료시 흑돌, 백돌의 개수를 출력

            //내 돌과 방금 둔 돌 사이의 대각선, 가로, 세로의 모든 상대돌이 내 돌로 바뀐다.
            N=sc.nextInt();
            M=sc.nextInt();
            Bcount=0;
            Wcount=0;
            arr=new int[N+2][N+2];

            int mid= N/2;
            arr[mid][mid]=2;
            arr[mid][mid+1]=1;
            arr[mid+1][mid+1]=2;
            arr[mid+1][mid]=1;


            Point point=new Point(0,0);
            //1이 흑돌, 2가 백돌
            for(int i=0;i<M;i++){
                int p=sc.nextInt();
                int q=sc.nextInt();
                point= new Point(p,q);
                int r=sc.nextInt();
                arr[q][p]=r;

//                for(int a=0;a<N+2;a++){
//                    for(int j=0;j<N+2;j++){
//                        System.out.print(arr[a][j]+" ");
//                    }
//                    System.out.println();
//                }

                isValid(point, r);
                //System.out.println(i+1+"번째");
            }
            for(int i=1;i<=N;i++){
                for(int j=1;j<=N;j++){
                    if(arr[i][j]==1)Bcount++;
                    else if(arr[i][j]==2)Wcount++;
                }
            }
            System.out.println("#"+test_case+" "+Bcount+" "+Wcount);


        }
    }
    public static boolean isCheck(int x, int y){
        if(x<0 || y<0 || x>N || y>N) return false;
        else return true;
    }
    public static void isValid(Point point, int r){
        int[][] dis = {{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};

        //1. +1방향 다른 돌 체크
        for(int j=0;j<8;j++) {
            Point np = new Point(point.x + dis[j][0], point.y + dis[j][1]);
            if(isCheck(np.x, np.y)){
                if(arr[np.y][np.x]!=r && arr[np.y][np.x]!=0){
                    //System.out.println("다른 돌"+np.x+" "+np.y);
                    boolean flag=false;
                    int cnt=2;
                    while(!flag){
                        np = new Point(point.x + dis[j][0]*cnt, point.y + dis[j][1]*cnt);
                        if(isCheck(np.x, np.y) && arr[np.y][np.x]!=0){
                            if(arr[np.y][np.x]==r){
                               // System.out.println("같은 돌"+np.x+" "+np.y);
                                flag=true;
                                break;
                            }
                            else cnt++;
                        }else break;
                    }
                    if(flag){
                      // System.out.println("처음 같은 돌 나오는 자리"+np.x+" "+np.y);
                       // System.out.println("돌 바꾸기 시작");
                        while(cnt!=0){
                           // System.out.println("현재 체크할 방향"+dis[j][0]+" "+dis[j][1]);
                           // System.out.println("바꾸기전 위치"+np.x+" "+np.y);
                            --cnt;
                            np = new Point(point.x + dis[j][0]*cnt, point.y + dis[j][1]*cnt);
                           // System.out.println("바꿀 돌"+np.x+" "+np.y);
                            arr[np.y][np.x]=r;
                        }

//                        System.out.println("바꾼 결과");
//                        for(int i=0;i<N+2;i++){
//                            for(int k=0;k<N+2;k++){
//                                System.out.print(arr[i][k]+" ");
//                            }
//                            System.out.println();
//                        }
                    }

                }
            }
        }
    }
}
반응형