[99클럽 코테 스터디 8일차 TIL] 백준 25593 근무 지옥에 빠진 푸앙이 (Small)

말하는 감자·2024년 11월 4일
0
post-thumbnail

99클럽 코테 스터디 8일차 TIL

💙 JAVA 비기너

📌 오늘의 학습 키워드

  • 해시

📌 공부한 내용

📍 오늘의 문제

📍 작성 코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map.Entry;

public class Main {

	public static void main(String[] args) throws IOException {
		
		HashMap<String, Integer> workMap = new HashMap<>();
		
	    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	    int count = Integer.parseInt(br.readLine());
	    
	    for (int i=0; i<count; i++) {
	    	for (int j=1; j<=4; j++) {
	    		String[] week = br.readLine().split(" ");
	    		for(String day : week) {
	    			if(!"-".equals(day)) {
	    				int hours = 0;
	    				if(j == 1) hours = 4;
	    				if(j == 2) hours = 6;
						if(j == 3) hours = 4;
						if(j == 4) hours = 10;
						
	    				workMap.put(day, workMap.getOrDefault(day, 0) + hours);
	    			}
	    		}
	    	}
	    }

	    br.close();
	    
	    int min = 3500, max = 0;
	    for (Entry<String, Integer> entry : workMap.entrySet()) {
	    	int value = entry.getValue();
            if(min > value) min = value;
            if(max < value) max = value;
        }
	    
	    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	    
	    bw.write((max - min <= 12) ? "Yes" : "No");
	    
	    bw.flush();
	    bw.close();
		
	}
}

📌 오늘의 회고

오늘도 역시 해시다!!
문제는 굉장히 길고 복잡하지만 사실은 별로 어렵지 않다.

가장 먼저 입력 받는 주의 개수를 count로 받고 그 만큼 for문을 돌려주었다.

4교대이므로 count만큼 돌리는 for문 안에 4번 반복하는 for문을 만들어줬다. 이때 몇번째 주인지 알려주는 j에 따라 몇시간 근무했는지를 hours에 넣어줬다.

그리고 한 주에 근무한 사람들에 대한 정보를 받아 공백을 기준으로 나눠서 문자열 배열에 저장해준다.

이 문자열 배열을 하나씩 돌면서 해시인 workMap에 넣어주되 존재하지 않는 근로자라면 HashMap.getOrDefault()를 통해 근무 시간을 0으로 만들어준 후 근무 시간인 hours를 넣어주고 이미 등록된 근로자라면 기존에 근무한 시간 + hours해서 다시 넣어준다.

for(String day : week) {
	if(!"-".equals(day)) {
	    int hours = 0;
	    if(j == 1) hours = 4;
	    if(j == 2) hours = 6;
		if(j == 3) hours = 4;
		if(j == 4) hours = 10;
						
	    workMap.put(day, workMap.getOrDefault(day, 0) + hours);
	 }
}

입력이 완료되어 근무자와 근무시간에 대한 정리가 완료되었다면 이제 가장 적게 일한 사람과 가장 많이 일한 사람의 근로시간 차이를 구해야 한다.

근로시간이 나올 수 있는 최고값은 50 x 7 x 10 = 3500 시간이므로 min을 3500으로 선언해주고 최솟값인 0을 max으로 선언해주었다.

그리고 workMap을 하나씩 돌면서 근로시간이 min보다 작다면 min에 저장해주고 max보다 크다면 max에 저장하여 각각 최소 근로시간과 최대 근로시간을 구해준다.

int min = 3500, max = 0;
for (Entry<String, Integer> entry : workMap.entrySet()) {
	int value = entry.getValue();
    if(min > value) min = value;
    if(max < value) max = value;
}

마지막으로 max - min이 12이하라면 "Yes"를, 아니라면 "No"가 출력되게 삼항연산자를 통해 비교 한 뒤 그 값을 BufferedWriter에 넣어줬다.

bw.write((max - min <= 12) ? "Yes" : "No");

bw.flush();로 넣어준 값을 다 출력하면 끄읏!

profile
나는 말하는 감자다

0개의 댓글