[SWEA/C++] 4615 재미있는 오셀로 게임 (DFS, 쉽고 짧은 코드)

2023. 2. 12. 23:15🧡 Programming/💻 코딩 테스트

 

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWQmA4uK8ygDFAXj

나는 오셀로 게임을 좋아했다. 

그리고 못하는 편은 아니라고 생각한다. (하지만 회사 내 어르신에게 여러 번 진 이력이 있다...)

사실 구석 4 모서리를 잘 선점하는 이기는 게임.. ㅋㅋㅋ 

 

문제에서 주어진 오셀로 게임의 설명은 다음과 같다.

 

 

무튼 이 문제의 핵심은 흑돌과 백돌을 번갈아가면서 주어진 인풋대로 두는데

각각 돌이 몇개냐를 묻는 문제이다. 

 

방법은 간단하다. 

돌을 입력받을 때 마다 find(y_coord, x_coord, wb)를 이용하여 돌을 두고 돌 색을 바꾸면 된다. 

 

void find(int Y, int X, int STONE) 함수를 보면 돌을 둔 위치에서 8방향을 체크한다.

돌을 두었다는 것 자체가 먹을 돌이 있다는 얘기이니까 돌을 두었을때 잡아먹을 수 있는 돌이 있는 지는 딱히 신경 쓸 필요가 없다. 

그리고 8방향 중 여러 방향으로 상대방 돌이 있기만 하면 걍 바로 내 돌로 바꿔주면 된다. 

(제일 끝에 상대방의 돌이 있으니까 그 돌 위치를 입력으로 준 것이다. 마지막에 내 돌이 있는지 굳이 신경쓰지 말자)

 

무튼 이런식으로 쭉 내 돌 깔고 상대방의 돌을 깔고 

 

제일 마지막에 map을 돌면서 각각의 돌의 개수를 카운트 하면 된다. 

 

#include <stdio.h>
 
int T, N, M; // N 한변길이, M 돌 놓는 횟수
// 1 : 흑돌 , 2 : 백돌
int map[10][10];
int dy[8] = { 0,0,1,1,1,-1,-1,-1 };
int dx[8] = { 1,-1,0,1,-1,0,1,-1 };
void setmap(int sy, int sx, int ey, int ex, int stone, int dir) {
    int y = sy, x = sx;
    while (true) {
        if (y == ey && x == ex) break;
        map[y][x] = stone;
        y += dy[dir]; x += dx[dir];
    }
     
}
void find(int Y, int X, int STONE) {
    for (int d = 0; d < 8; d++) {
        int ny = Y + dy[d];
        int nx = X + dx[d];
        if (ny<1 || nx<1 || ny>N || nx>N) continue;
        if (map[ny][nx] == 0 || map[ny][nx] == STONE) continue;
 
        while (1) {
            ny += dy[d]; nx += dx[d];
            if (ny<1 || nx<1 || ny>N || nx>N) break;
            if (map[ny][nx] == 0) break;
            if (map[ny][nx] == STONE) {
                setmap(Y,X,ny,nx,STONE,d);
                break;
            }
        }
 
    }
}
void init() {
    for (int y = 1; y <= N; y++)
        for (int x = 1; x <= N; x++)
            map[y][x] = 0;
    map[N / 2][N / 2] = 2;
    map[(N / 2) + 1][(N / 2) + 1] = 2;
    map[(N / 2) + 1][N / 2] = 1;
    map[N / 2][(N / 2) + 1] = 1;
}
int main() {
    scanf("%d", &T);
    for (int tc = 1; tc <= T; tc++) {
        scanf("%d %d", &N, &M);
        init();
        int y_coord, x_coord, wb;
        for (int c = 1; c <= M; c++) {
            scanf("%d %d %d", &x_coord, &y_coord, &wb);
            find(y_coord, x_coord, wb);
        }
 
        int cnt1=0, cnt2=0;
        for (int y = 1; y <= N; y++) {
            for (int x = 1; x <= N; x++) {
                if (map[y][x] == 1) cnt1++;
                if (map[y][x] == 2) cnt2++;
            }
        }
        printf("#%d %d %d\n", tc, cnt1, cnt2);
    }
    return 0;
}