알고리즘
[백준] 26693번 : 근무 지옥에 빠진 푸앙이 (Small) - JAVA
DoosanBaek
2024. 11. 16. 19:34
문제 분석
- 둘째 줄 부터 근무표가 주어진다.
- 각 주는 4개의 줄로 표현된다.
- 첫째 줄은 각 날의 08 : 00 ~ 12:00에 근무하는 사람의 이름
- 둘째 줄은 각 날의 12:00 ~ 18 :00에 근무하는 사람의 이름
- 셋째 줄은 각 날의 18:00 ~ 22:00에 근무하는 사람의 이름
- 넷째 줄은 각 날의 22:00 ~ 08 : 00에 근무하는 사람의 이름
제약 조건
- 첫 번째 줄에 주의 개수인 N 입력 ( 1<= N <=50 )
- 근무자의 이름은 모두 알파벳 소문자 ( 20글자를 넘지 않는다.)
- 근무표에 적히지 않은 근무자는 없고, 근무자 수는 최대 100명
- 각 날에는 4개의 시간대에 모두 근무자가 있거나 모두 근무자가 없다.
의사 결정
- 근무표 주의 수 N을 Scanner 를 이용해 입력 받는다.
- 근무 시간 계산을 위한 Map을 작성한다.
- 근무표 처리를 이중 for 문으로 하고, 바깥쪽의 for문으로 근무표를 처리하고 안쪽 for문으로 4개의 시간대별 근무자를 Map에 넣는다.
- 가장 많은 근무 시간, 가장 적은 근무 시간을 Integer로 선언하고, 반복문을 통해 일하는 시간을 넣는다.
- 조건문으로 가장 많은 근무시간 과 가장 적은 근무시간의 차이가 12 이하이면 YES 출력, 아닐경우 NO를 출력한다.
내풀이
package com.doosane.study01.week01.day4.bronze;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class BOJ25593 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
// 근무표 주의 수 N
sc.nextLine(); //버퍼 비움
Map<String, Integer> workTime = new HashMap<>();
// 근무 시간 계산을 위한 Map 작성
for(int i =0 ; i < N ; i++) {
// 근무표를 처리
for(int j =0 ; j < 4; j++) {
// 4개의 시간대별 근무자를 입력받음
String[] shift = sc.nextLine().split(" ");
int workHours = 0;
if(j == 0) workHours = 4; // 08:00~12:00
if (j == 1) workHours = 6; // 12:00 ~ 18:00
if(j == 2 ) workHours = 4; // 18:00 ~ 22:00
if(j == 3) workHours = 10; // 22:00 ~ 08:00
for (String name : shift) {
// 해당 시간대에 근무자 있으면 , 근무 시간에 추가
if( !name.equals("-")) {
workTime.put(name, workTime.getOrDefault(name, 0) + workHours);
}
}
}
}
int minTime = Integer.MAX_VALUE; // 가장 많은 근무 시간
int maxTime = Integer.MIN_VALUE; // 가장 적은 근무 시간
for (int time : workTime.values()) {
minTime = Math.min(minTime, time);
maxTime = Math.max(maxTime, time);
}
// 공평 확인 후 출력
if(maxTime - minTime <= 12) {
System.out.print("Yes");
} else {
System.out.println("No");
}
}
}