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 |