알고리즘/2023 구름톤 챌린지

구름톤 챌린지 2주차 - 2

hw-ani 2023. 8. 27. 16:27

2023.08.24.(목)

#include <stdio.h>

#define SIZE 200

int main() {
    int bombValue[SIZE][SIZE] = {0,};
    char landState[SIZE][SIZE];
    
    int N, K;
    scanf("%d %d", &N, &K);
    
    // 땅 상태 입력받기
    for (int i=0; i<N; i++) {
        for (int j=0; j<N; j++) {
            scanf(" %c", &landState[i][j]);
        }
    }
    
    // 폭탄 떨구며 값 계산하기
    int x, y;
    int dir[5][2] = {{0,0}, {0,1}, {1,0}, {-1,0}, {0,-1}};
    for (int i=0; i<K; i++) {
        scanf("%d %d", &x, &y);
        --x; --y;
        for (int j=0; j<5; j++) {
            int nx = x+dir[j][0];
            int ny = y+dir[j][1];
            if (nx>-1 && nx<N && ny>-1 && ny<N && landState[nx][ny] != '#') {
                if (landState[nx][ny] == '@')
                    bombValue[nx][ny] += 2;
                else
                    bombValue[nx][ny] += 1;
            }
        }
    }
    
    // 최대값 찾아서 출력하기
    int max = 0;
    for (int i=0; i<N; i++)
        for (int j=0; j<N; j++)
            if (max < bombValue[i][j])
                max = bombValue[i][j];
    
    printf("%d", max);
}

폭탄 값을 땅 상태에 따라 계산해야 합니다. 따라서 폭탄 값을 저장하는 배열과 땅 상태를 저장하는 배열 두개를 둡니다. (1)우선 땅 상태를 입력습니다. (2)그리고 입력으로 들어오는 좌표와 땅 상태에 따라 폭탄 값을 계산합니다. (3)마지막으로 최대 폭탄 값을 찾아 출력합니다.

 

 

 


2023.08.25.(금)

// 아 숫자가 두자리 이상 들어오는 걸 고려 안해서 계속 틀렸었네...

#include <stdio.h>

#define SIZE 205

int processGame(int map_count[][SIZE], char map_command[][SIZE], int N, int x, int y);

int main() {
    int N;
    scanf("%d", &N);
    
    int goormCoor[2];
    int playerCoor[2];
    scanf("%d %d", &goormCoor[0], &goormCoor[1]);
    scanf("%d %d", &playerCoor[0], &playerCoor[1]);
    
    char map_command[SIZE][SIZE];
    int map_count[SIZE][SIZE];
    for (int i=0; i<N; i++)
        for (int j=0; j<N; j++) {
            scanf("%d", &map_count[i][j]);
            scanf("%s", &map_command[i][j]);
        }
    
    int goormScore = processGame(map_count, map_command, N, goormCoor[0]-1, goormCoor[1]-1);
    int playerScore = processGame(map_count, map_command, N, playerCoor[0]-1, playerCoor[1]-1);
    
    if (goormScore > playerScore)
        printf("goorm %d", goormScore);
    else
        printf("player %d", playerScore);
    
    return 0;
}

int processGame(int map_count[][SIZE], char map_command[][SIZE], int N, int x, int y) {
    int visited[SIZE][SIZE] = {0,};
    int result = 0;
    
    visited[x][y] = 1;  ++result;
    
    while (1) {
        int count = map_count[x][y];
        char command = map_command[x][y];
        while (count) {
            switch (command) {
                case 'U': x--; break;
                case 'D': x++; break;
                case 'L': y--; break;
                case 'R': y++; break;
            }
            if (x < 0)
                x = N-1;
            else if (x >= N)
                x = 0;
            if (y < 0)
                y = N-1;
            else if (y >= N)
                y = 0;
            if (visited[x][y])
                goto out;
            visited[x][y] = 1; ++result;
            count--;
        }
    }
    
out:
    return result;
}

처음엔 숫자가 두자리 이상 들어오는 경우를 생각하지 않았다가 이틀동안 대체 어디가 문제인지 계속 고민했습니다. 예제에도 한자리 숫자만 주길래 처음엔 입력을 char로 파싱해서 -'0'를 하는 방식으로 구현했는데, map 크기가 200까지 되니까 숫자가 2자리 이상인 경우도 있어서 자꾸 틀리는 거였습니다. 그래서 코드에 보이는 것처럼 애초에 int를 먼저 입력받고, 문자열을 입력받도록 하니 잘 해결됐습니다.

processGame() 함수에서 게임이 진행됩니다. map 각 칸의 명령에 따라 말을 이동시키며 방문한 곳을 체크하고 방문한 곳의 개수를 카운트합니다. 방문했던 곳을 또 방문하면 게임이 종료되도록 합니다. 게임이 종료되도록 할 때 goto 문을 사용하여 이중반복문을 빠져나오도록 하였습니다. goto문은 되도록 지양하라고 배웠는데, 이렇게 이중 반복문을 빠져나오도록 하는 특수한 경우에는 사용하는 것이 가독성이 좋다고 하길래 써봤습니다.(해설 코드에서 이렇게 풀었길래 ㅎㅎ)

 

'알고리즘 > 2023 구름톤 챌린지' 카테고리의 다른 글

구름톤 챌린지 2주차 - 1  (0) 2023.08.24
구름톤 챌린지 1주차 - 2  (0) 2023.08.18
구름톤 챌린지 1주차 - 1  (0) 2023.08.16