BOJ 10836 여왕벌
-
변수
int M = Integer.parseInt(st.nextToken()); // 벌집의 크기 int N = Integer.parseInt(st.nextToken()); // 업데이트 될 애벌레 경우의 수
-
코드
package baekjoon.Gold; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class BOJ_10836_여왕벌 { private static int[][] map; private static int M; private static int N; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); BOJ_10836_여왕벌 BeeProblem = new BOJ_10836_여왕벌(); M = Integer.parseInt(st.nextToken()); // 벌집의 크기 N = Integer.parseInt(st.nextToken()); // 업데이트 될 애벌레 경우의 수 map = new int[M][M]; for (int tc = 0; tc < N; tc++) { int[] add = new int[2 * M - 1]; st = new StringTokenizer(br.readLine()); int idx = Integer.parseInt(st.nextToken()); for (int i = 1; i < 3; i++) { int n = Integer.parseInt(st.nextToken()); for (int k = 0; k < n; k++) { // 0, 1, 2의 갯수 add[idx++] = i; } } BeeProblem.beeHome(add); // 벌집을 해당 배열로 한바퀴 돌리고 update } // BeeProblem.insideUpdate(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { if (i >= 1 && j >= 1) { map[i][j] = map[i - 1][j]; } else { map[i][j] = map[i][j] + 1; } sb.append(map[i][j]).append(' '); } sb.append('\n'); } System.out.println(sb); } private void beeHome(int[] add) { int r = M - 1; int c = 0; for (int i = 0; i < add.length; i++) { if (r > 0) { map[r--][0] += add[i]; } else { map[0][c++] += add[i]; } } } private void insideUpdate() { for (int i = 1; i < M; i++) { for (int j = 1; j < M; j++) { map[i][j] = map[i - 1][j]; } } } }
-
느낀점
- 다양한 꿀팁이 담겨있는 좋은 문제였다
✨ 꿀팁1 : 초기 setting값 지정하기
int[][] map = null; for(int i=0; i<M; i++){ // M은 배열의 크기, size Arrays.fills(map[i], 1); // Arrays.fills(1차원 배열, 채우고 싶은 숫자) }
👉 꿀팁2 : 출력을 자세히 살펴보면 왼쪽, 왼쪽 대각선, 위를 비교해 가장 큰 값을 가져온다.
애벌레들이 자라는 정도를 왼쪽 제일 아래 칸에서 시작하여 위쪽으로 가면서 읽고, 제일 위쪽 칸에 도착하면 오른쪽으로 가면서 행의 끝까지 읽었다고 하자. 모든 입력에서 이렇게 읽은 값들은 감소하지 않는 형태이다.=> 초기 설정값에서 변화 없이 큰 값은 그대로 사용한다 (시간 초과 문제 해결)
👉 꿀팁 3 : 필요없는 for문 합치기 or 없애기 -> (시간 초과 문제 해결)
[코드 1] 과 같이 내부를 채워주는 함수가 따로 필요없었기 때문에 [코드 2] 하나만 사용해서 한번에 뽑았다
[코드 1]
private void insideUpdate() { for (int i = 1; i < M; i++) { for (int j = 1; j < M; j++) { map[i][j] = map[i - 1][j]; } } }
[코드 2]
// BeeProblem.insideUpdate(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < M; i++) { for (int j = 0; j < M; j++) { if (i >= 1 && j >= 1) { map[i][j] = map[i - 1][j]; } else { map[i][j] = map[i][j] + 1; } sb.append(map[i][j]).append(' '); } sb.append('\n'); } System.out.println(sb);
✨ 꿀팁 4 : static 사용하지 않기
자바에서는 static을 지양한다 -> 자바는 객체지향언어인데 static은 객체지향적이지 않다
그럼 static을 쓰지않고 어떻게 코드를 구현할까? 클래스를 선언해서 그 클래스를 통해 함수를 불러온다
👉 꿀팁 5 : 0인 경우… for문을 돌려줘야 하는가?
-> 반복문을 돌려줄 필요가없는 ( 이 문제의 경우 0의 갯수 부분 ) 부분을 제외시켜 준다
[ 해당 코드 ]
st = new StringTokenizer(br.readLine()); int idx = Integer.parseInt(st.nextToken()); for (int i = 1; i < 3; i++) { int n = Integer.parseInt(st.nextToken()); for (int k = 0; k < n; k++) { // 0, 1, 2의 갯수 add[idx++] = i; } }
문제 링크 : 백준 10836 여왕벌
Leave a comment