package source_code;
import java.util.Scanner;
// 테이블: W개씩 H행
// 모든 참가자는 세로로 N or 가로로 M칸 이상 비우고 앉아야 함
// = 다른 참가자와 세로줄 번호의 차가 N보다 크거나 가로줄 번호 차가 M보다 큰 곳에만 앉을 수 있음
// => 강의실이 거리두기 수칙을 지키면서 최대 몇 명을 수용할 수 있는가?
// 입력: H(세로 길이), W(가로 길이), N(세로 띄움), M(가로 띄움)
// 출력: 수용 가능한 최대 인원 수
// 1. H / (1 + N) => 세로로 들어가는 최대 사람 수
// 2. W / (1 + M) => 가로로 들어가는 최대 사람 수
// 3. 1번 * 2번 => 최대 수용 가능 인원 수
public class B_B3_23971_ZOAC {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int height = sc.nextInt();
int width = sc.nextInt();
int spaceNum_height = sc.nextInt();
int spaceNum_width = sc.nextInt();
// 1. 세로로 들어가는 최대 사람 수
int heightNumCal1 = height % (1 + spaceNum_height);
int heightNumCal2 = height / (1 + spaceNum_height);
int maxHeightNum = 0;
if(heightNumCal1 == 0) {
maxHeightNum = heightNumCal2;
}else {
maxHeightNum = heightNumCal2 + 1;
}
// 2. 가로로 들어가는 최대 사람 수
int maxWidthNum = 0;
int widthNumCal1 = width % (1 + spaceNum_width);
int widthNumCal2 = width / (1 + spaceNum_width);
if(widthNumCal1 == 0) {
maxWidthNum = widthNumCal2;
}else {
maxWidthNum = widthNumCal2 + 1;
}
// 3. 최대 수용 가능 인원 수
int maxNum = maxHeightNum * maxWidthNum;
//System.out.println("maxHeightNum: " + maxHeightNum + " " + "maxWidthNum: " + maxWidthNum);
System.out.println(maxNum);
}
}
거의 반 년만의 코테 문제라 브론즈부터 시작해봤다.
자바도 반 년만에 쓰는거라 문법도 어색하여 그런지 쓸데없이 변수를 너무 많이 선언한 느낌이다.
코틀린으로 코드를 짤 때는 간단하게 표현되던 문법들이 자바에서는 허용되지 않는다는 게 생각보다 꽤 불편했다.
또한 반 년전 A형 준비를 하면서 강사님께서 강조하셨던, 상단에 문제 요약과 풀이방법을 적고 변수는 꼭 의미를 부여하여 적으라는 말씀도 그대로 적용해보았다.
불필요한 조건문 제거 가능
int maxHeightNum = (height + spaceNum_height) / (spaceNum_height + 1);
int maxWidthNum = (width + spaceNum_width) / (spaceNum_width + 1);
혹은 삼항 연산자 활용
-> 코틀린에서는 변수 = 뒤에 if else를 붙이는게 가능해서 삼항 연산자를 잊고 있었다..
변수명이 길지만 중복되고, 복잡함
heightNumCal1, heightNumCal2 → heightMod, heightQuotient 정도로 표현 가능
-> 단순 수 부여보다는 의미를 담을 것..!
불필요한 if문 제거
(height + N) / (N + 1)로 계산하면 따로 나머지를 따질 필요가 없다.
import java.util.Scanner;
public class B_B3_23971_ZOAC {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int totalRows = sc.nextInt(); // 강의실 총 행 수 (H)
int totalCols = sc.nextInt(); // 강의실 총 열 수 (W)
int minRowSpacing = sc.nextInt(); // 세로 거리두기 간격 (N)
int minColSpacing = sc.nextInt(); // 가로 거리두기 간격 (M)
// (참가자 한 명 기준) 필요한 최소 행/열 간격 = 본인 + 띄워야 할 거리 => (간격 + 1)
int maxRowsAvailable = (totalRows + minRowSpacing) / (minRowSpacing + 1);
int maxColsAvailable = (totalCols + minColSpacing) / (minColSpacing + 1);
int maxParticipants = maxRowsAvailable * maxColsAvailable;
System.out.println(maxParticipants);
}
}