반응형
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();
// }
}
}
}
}
}
}
반응형
'Java > Java 알고리즘 SWEA' 카테고리의 다른 글
[SW 아카데미] 3282. 0/1 Knapsack (0) | 2022.10.27 |
---|---|
[SW 아카데미] 1493. 새로운 수의 연산 # (0) | 2022.10.27 |
[SW 아카데미] 1860. 진기의 최고급 붕어빵 (0) | 2022.10.26 |
[SW 아카데미] 5215. 햄버거 다이어트 (0) | 2022.10.26 |
[SW 아카데미] 1289. 원재의 메모리 복구하기 (0) | 2022.10.26 |