구름 LEVEL JAVA - 폭탄 구현하기(2) (난이도 2)
May 27, 2024
»
algorithm
구름 난이도 2 폭탄 구현하기(2)
문제 요약
Ⅰ. 정사각형의 땅이 N개 있을 때 N개의 폭탄을 투하하면 폭탄점수 증가.
Ⅱ. ( # )은 0점, ( 0 )은 1점, ( @ )은 2점 씩 증가.
Ⅲ. 상하좌우 (+)십자가 모양으로 인접한 땅도 같이 증가한다.
Ⅳ. 모든 땅의 폭탄 값 중 최대값은?
※ 단 입력값은 모두 1보다 크다
코드
import java.io.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 폭탄 투하시 폭탄점수 = [# : 0] , [0 : +1] , [@ : +2]
// 떨어진 폭탄의 상하좌우 십자가(+) 모양도 똑같이 영향을 받는다,
// 단 모든 입력 값은 1 보다 크거나 같다.
String st = new StringTokenizer(br.readLine() , " ");
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// 상하좌우(y , x)가 있어 2차원 배열 생성
// 최소 입력 값이 1이라 인덱스 5개를 생성
// 땅
char[][] ground = new char[N + 1][N + 1];
// 땅의 폭탄 점수
int[][] score = new int[N + 1][N + 1];
// 땅의 상태 (# , 0 , @)
for( int i=1; i<=N i++ ) {
st = new StringTokenizer(br.readLine() , " ");
for( int j=1; j<=N; i++ ) {
ground[i][j] = st.nextToken().charAt(0);
}
}
// 폭탄 투하 인접한 땅의 값 세팅
int[] dy = {1 , -1 , 0 , 0};
int[] dx = {0 , 0 , 1 , -1};
// 폭탄 투하
for( i=0; i<=K; i++) {
st = new StringTokenizer(br.readLine(), " ");
// 폭탄 투하 좌표
int y = Integer.parseInt(st.nextToken());
int x = Integer.parseInt(st.nextToken());
// 투하지점 땅
if( ground[y][x] == "0" ) {
score[y][x]++;
} else if( ground[y][x] == "@" ) {
score[y][x] += 2;
}
// 인접한 땅
for( int j=0; j<4; j++) {
int tempY = y + dy[j];
int tempX = x + dx[j];
// 인접 한 땅이 있을때만
if(inSpaceCheck(tempY , tempX , N)) {
if( ground[tempY][tempX] == "0" ) {
score[tempY][tempX]++;
} else if( ground[tempY][tempX] == "@" ) {
score[tempY][tempX] += 2;
}
}
}
}
// 가장 높은 값
int result = 0;
for( int i=1; i<=N; i++) {
for( int j=1; j<=N; j++) {
result = Math.max(result , score[i][j]);
}
}
System.out.println(result);
}
// 인접한 땅이 존재하는지 체크
public static inSpaceCheck(int y, int x, int n) {
return y > 0 && y <= n && x > 0 && x <= n;
}
}
풀이
-
땅(ground), 땅의 폭탄점수(score)는 상하좌우가 있어 2차원 배열생성,
모든 입력 값이 최소 1 이라 배열 생성할때 입력 값의 +1 을 해준다. -
땅의 상태 값은 인덱스 1부터 입력 받은 땅의 길이(N)만큼 for 문을 사용해 입력을 받고, y , x 값 2차원 배열의 값을 세팅 해야해서 이중 for 문을 사용.
-
상하좌우 (+)십자가 모양인 인접한 땅의 변경값을 계산할 1차원 배열 두개(dy,dx)를 세팅.
-
인덱스 1부터 폭탄 투하 개수(K)만큼 for 문을 사용해 투하 좌표(y,x)를 입력받는다.
-
입력받은 좌표를 (2)번에서 세팅한 2차원 배열인 땅의 상태값에 따른 점수를 증가 시킨다.
- (4)번 for 문 안에서 이중 for 문을 사용해 (3)번에서 세팅한 인접한 땅
dy , dx 값을 입력 받은 좌표에 더해 땅이 존재하는지 체크한다.
- 계산한 좌표의 값은 항상 0보다는 크고, 입력한 땅의 수와 같거나 작아야 한다.
- 계산한 좌표의 값은 항상 0보다는 크고, 입력한 땅의 수와 같거나 작아야 한다.
-
(6)번에서 문제가 없다면 계산한 좌표값 땅의 상태에 따른 점수를 증가시킨다.
- 최종적으로 이중 for 문을 돌려 점수(score) 배열에 최대값을 Math.max 함수를 이용해 찾는다.