BOJ 10836 여왕벌

3 minute read

  1. 변수

    int M = Integer.parseInt(st.nextToken()); // 벌집의 크기
    int N = Integer.parseInt(st.nextToken()); // 업데이트 될 애벌레 경우의 수
    
  2. 코드

    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];
    			}
    		}
    	}
    }
       
    
  3. 느낀점

    • 다양한 꿀팁이 담겨있는 좋은 문제였다

    ✨ 꿀팁1 : 초기 setting값 지정하기

    image

    int[][] map = null;
    for(int i=0; i<M; i++){ // M은 배열의 크기, size
    	Arrays.fills(map[i], 1); // Arrays.fills(1차원 배열, 채우고 싶은 숫자)	
    }
    

    👉 꿀팁2 : 출력을 자세히 살펴보면 왼쪽, 왼쪽 대각선, 위를 비교해 가장 큰 값을 가져온다.

    애벌레들이 자라는 정도를 왼쪽 제일 아래 칸에서 시작하여 위쪽으로 가면서 읽고, 제일 위쪽 칸에 도착하면 오른쪽으로 가면서 행의 끝까지 읽었다고 하자. 모든 입력에서 이렇게 읽은 값들은 감소하지 않는 형태이다.

    => 초기 설정값에서 변화 없이 큰 값은 그대로 사용한다 (시간 초과 문제 해결)

    image

    👉 꿀팁 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을 쓰지않고 어떻게 코드를 구현할까? 클래스를 선언해서 그 클래스를 통해 함수를 불러온다

    image

    image

    👉 꿀팁 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