코딩문제풀이/Baekjoon

[Java] 백준 10836번 : 여왕벌

코딩하는 포메라니안 2023. 2. 20. 18:22

1. 문제

https://www.acmicpc.net/problem/10836

 

10836번: 여왕벌

입력의 첫 줄에는 격자칸의 가로와 세로 크기 M(2 ≤ M ≤ 700)과 날짜 수 N(1 ≤ N ≤ 1,000,000)이 자연수로 주어진다. 첫날 아침의 애벌레 크기는 모두 1이므로 입력에 주어지지 않는다. 다음 N개의

www.acmicpc.net

 

 

2. 풀이과정

자라는 정도가 아래에서 위로 & 왼쪽에서 오른쪽으로 갈수록 증가한다.

따라서 가장 왼쪽 열과 가장 위쪽 행을 제외한 다른 칸들은 윗칸과 동일한 값을 가질 수 밖에 없다.

 

날짜수만큼 반복문을 돌면서, +1이 시작하는 위치와 +2가 시작하는 위치를 계산해서 해당 위치에 +1을 해준다.

반복문이 끝나면 증가량을 기록한 배열의 0번째 부터 끝까지 돌면서 (자신) + (이전 값)을 해주면, 해당 칸의 총 증가량을 계산할 수 있다.

 

+) +2가 시작하는 위치는 0의 개수 + 1의 개수이다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int day = Integer.parseInt(st.nextToken());
        int size = 2*N-1;
        int[] up = new int[size+1];

        while(day-- > 0){
            st = new StringTokenizer(br.readLine());
            int zero = Integer.parseInt(st.nextToken());
            int one = zero + Integer.parseInt(st.nextToken());
            up[zero]++;
            up[one]++;
        }

        for(int i=0; i<size; i++){
            up[i+1] += up[i];
        }

        StringBuilder sb = new StringBuilder();
        for(int i=N-1; i>=0; i--){
            sb.append(up[i]+1);
            for(int j=N; j<size; j++){
                sb.append(" ").append(up[j]+1);
            }
            sb.append("\n");
        }
        System.out.print(sb);
    }

}

 

 

결과