Back-End공부하는 Hero의 개발공부일기
article thumbnail

 

백준 문제들을 구경하다가 "대기업 코테에서 나오는 유형 모음"이라고 인기 있는 문제집이 있어서 취미 삼아 난이도가 낮은 것부터 순서대로 풀어볼 생각이 들었다.

 

백준 23971번 ZOAC 4

 

 

문제분석

난이도가 낮아서 그런지 정말 쉬운 문제였다. 문제설명은 W,H순으로 말하다가 입력받을 때는 H, W순으로 받는다거나 굳이 이해하기 쉽게 설명할 수 있는데 억지로 꼬아서 말하려고 하는 것 같아 억지로 만든 문제구나 싶었다. 

 

내가 이해하기 쉽게 정리한 내용은 아래와 같다.

1. H행 W열로 이루어진 테이블이 존재한다.
2. 테이블에는 각 참가자들간 세로로(행) N칸, 가로로(열) M칸 이상 떨어져 앉아야 한다.
3. 최대 앉을 수 있는 참가자는 몇명인가.

 

문제 풀이

문제를 보고 푸는 데까지 1분 이채 걸리지 않았다. 순서대로 생각하면 금방 풀 수 있다.

 

1. (1,1)은 고정으로 사람을 앉고, 세로나 가로로 거리 두기를 진행하고 앉아야 한다.

예를 들어, 4(H) x4(W)로 테이블이 존재하면 가로로 3칸 세로로 3칸 내에 다른 참가자가 존재할 수 있다.

 

2. 참가자가 앉는 자리와 거리 두기를하나의 덩어리로 간주한다.

예를 들어, 가로로 1칸, 세로로 2칸의 거리 두기가 필요하다면, 참가자는 총 가로로 2칸, 세로로 3칸을 차지한다.

 

3. 첫 번째를 제외한 존재할 수 있는 참가자의 수는

세로 (H - 1) / (N + 1), 가로 (W - 1) / (M + 1) 다.

 

4. 첫 번째에서 제외한 (1,1)를 더함으로써 하나의 열 또는 하나의 행에 최대로 앉을 수 있는 참가자의 수를 구할 수 있다.

세로 (H - 1) / (N + 1) + 1, 가로 (W - 1) / (M + 1) + 1 다.

 

5. 하나의 열에 앉을 수 있는 최대 참가자 x 하나의 행에 앉을 수 있는 최대 참가자 = 강의실에 앉을 수 있는 최대 참가자 수다.  

최대 참가자 수  = ((H - 1) / (N + 1) + 1) x ((W - 1) / (M + 1) + 1)

 

계산 식을 위와 같이 구했으니 그대로 코드로 옮겨주면 된다.

 

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

// 23971번 - ZOAC 4
public class Main {

    public static void main(String[] args) throws IOException {
        // 입력을 효율적으로 처리하기 위해 BufferedReader를 사용하여 입력을 받음
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // [행, 열, 세로공백, 가로공백]을 한줄로 입력 받음
        StringTokenizer str = new StringTokenizer(br.readLine());
        int row = Integer.parseInt(str.nextToken()); 	// 테이블 행 H
        int column = Integer.parseInt(str.nextToken()); // 테이블 열 W
        int rowGap = Integer.parseInt(str.nextToken()); // 참가자 세로 공백 N
        int columnGap = Integer.parseInt(str.nextToken()); // 참가자 가로 공백 M
        
        // 최대 참가자 수 구하는 공식
        int result = ((row-1)/(rowGap+1)+1) * ((column-1)/(columnGap+1)+1);
        
        // 답 출력
        System.out.println(result);
    }
}

 

마무리

앞선 문제들이 로직을 생각하는데 많은 시간이 필요했던 거에 비해 해당 문제는 너무나도 쉽게 풀 수 있었다. 마치 고등학생에게 초등학교 문제를 풀라는 느낌이랄까?? 알고리즘 문제라기 보단... 그냥 수학문제 느낌이 강했다. 이런 쉬운 문제는.. 풀어도 시간 들여 문제 풀이를 작성해야 하나 싶었지만 나에게는 쉬워도 어려운 사람이 있을 수 있다는 생각에 작성하게 되었다.

profile

Back-End공부하는 Hero의 개발공부일기

@Back-Hero

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!