코딩테스트/구름톤 챌린지

[Java] 구름톤 챌린지 2주차 : 폭탄 구현하기 (2)

이덩우 2023. 8. 24. 22:50

- 문제설명

 


- 해결과정

최초 주어지는 배열만 가지고 문제를 해결할 수 없었다.

최초 배열의 정보를 가지고 누적해서 스코어를 계산해 나가야하기 때문에, 최초 배열과 동일한 사이즈의 점수판이 필요했다.

 

조금 다른 관점으로, 하나의 배열판만 쓰지만 타입을 직접만든 static class로 지정해줬다.

해당 클래스에는 

1. init 이라는 최초 배열 정보

2. score 라는 누적 점수 정보

이렇게 두 가지가 포함되어 있는 클래스이다.

 

문제풀이 흐름은 아래와 같다.

  • 입력으로 주어지는 정보를 배열로 받는다. 이때는 최초 배열이므로 생성자 주입을 통해 멤버변수 init에 정보를 담는다.
  • 이제 폭탄을 떨구며 점수를 획득하자. 상황별로 몇 점을 주냐만 다르지 점수를 주는 방식은 
    getScore() 메소드로 기존 점수를 불러오고 setScore() 메소드로 기존점수 + N점을 적용하면 된다.
  • 모든 폭탄을 소모했다면 배열을 처음부터 끝까지 순회하며 setScore() 메소드로 최대값을 갱신해가며 찾는다.
    이후 출력으로 내보내면 된다.

 


- 솔루션

import java.io.*;
import java.util.*;
class Main {
	
	private static int[] dx = {0, 1, -1, 0, 0};
	private static int[] dy = {0, 0, 0, 1, -1};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());
		Node[][] board = new Node[N][N];
		
		for(int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			for(int j = 0; j < N; j++) {
				board[i][j] = new Node(st.nextToken());
			}
		}
		
		for(int i = 0; i < K; i++) {
			st = new StringTokenizer(br.readLine());
			int y = Integer.parseInt(st.nextToken()) - 1;
			int x = Integer.parseInt(st.nextToken()) - 1;
			
			for(int j = 0; j < 5; j++) {
				int nextY = y + dy[j];
				int nextX = x + dx[j];
				try {
					int preScore = board[nextY][nextX].getScore();
					if(board[nextY][nextX].getInit().equals("0")) {
						board[nextY][nextX].setScore(preScore + 1);
					} else if(board[nextY][nextX].getInit().equals("@")) {
						board[nextY][nextX].setScore(preScore + 2);
					} else {
						board[nextY][nextX].setScore(0);
					}
				} catch (ArrayIndexOutOfBoundsException e) {}
			}
		}
		
		int maxValue = 0;
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < N; j++) {
				int temp = board[i][j].getScore();
				if(temp > maxValue) {
					maxValue = temp;
				}
			}
		}
		
		bw.write(Integer.toString(maxValue));
		bw.flush();
		bw.close();
		
	}
	
	static class Node {
		private String init;
		private int score;

		public Node(String init) {
			this.init = init;
		}
		
		public void setScore(int score) {
			this.score = score;
		}
		
		public String getInit() {
			return init;
		}
		
		public int getScore() {
			return score;
		}
		
	}
}