반응형
https://www.acmicpc.net/problem/25593
- 해시를 공부하면서 유용했던 메소드들을 이곳에 다시 재정리해본다.
- Map.put(K key, V value) : 키와 값 추가
- Map.putIfAbsent(K key, V value) : 특정 키가 없을 때만 키와 값을 추가
- Map.get(Object key) : 키값 1개 반환
- Map.getOrDefault(Object key, V defaultValue): 특정 키가 없을 때 기본값 반환
- Map.keySet() : 모든 키를 Set 형태로 반환
=> for(String key:map.keySet()){} - Map.values() : 모든 값을 Collection 형태로 반환
=>for(String value:map.values()){} - Map.entrySet() : 키-값 쌍으로 이루어진 Map.Entry 객체들의 Set을 반환
=> for(Map.Entry<String,String> entry:map.EntrySet()){entry.getKey; entry.getValue();}
1) 내가 구현한 코드
- 실수했던 점 : 출력할 때 대문자 YES, NO로 작성해서 1시간동안 틀린원인을 찾지 못했다. 너무 화가났다.... 마치 식은 다 맞히고 계산실수한거같은느낌ㅠ 앞으로 출력문 잘 보고 작성하도록 하자...!!!!!
- 계속 잊는 부분 : 인텔리제이로 문제풀이하여 오류를 바로바로 잡아주었지만, 자꾸만 BufferedWriter, BufferedReader 쓸 때 exception을 던지지 않는다ㅠ!!! throws IOException 잊지 말도록!!!!!!
- 반복문에서 4,6,4,10시간을 누적해야하는데 처음에는 제어문을 이용했었다. if(k==0) cnt = 4; else if(k==1) cnt=6; ..
굳이 그렇게 하지 않고, int 배열에 4,6,4,10을 저장하고 timeArr[k]로 누적하면 편할 것이다!!!
import java.util.*;
import java.io.*;
public class p25593_근무지옥에빠진푸앙이 {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
HashMap<String,Integer> map = new HashMap<>();
int N = Integer.parseInt(st.nextToken()); //주의 개수
int[] timeArr = {4,6,4,10};
for(int i=0; i<N; i++){
for(int k=0; k<4; k++){
st = new StringTokenizer(br.readLine());
for(int j=0; j<7; j++){
String name = st.nextToken();
if(!name.equals("-")) map.put(name,map.getOrDefault(name,0)+timeArr[k]);
}
}
}
//System.out.println(map);
// 최대 및 최소값 계산
if (map.isEmpty()) { // 근무자가 전혀 없는 경우
bw.write("Yes");
} else {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for(Integer value:map.values()){
if(value > max) max = value;
if(value < min) min = value;
}
if(max - min <= 12) {
bw.write("Yes");
} else {
bw.write("No");
}
}
bw.flush();
br.close();
bw.close();
}
}
2) 오늘의 학습 키워드
- 4교대 근무표 공평성 검증
- HashMap 활용한 근무 시간 계산
- 조건문과 반복문을 통한 자료 처리
3) 문제이해
- 군대 4교대 근무표의 근무 시간을 공평하게 나누는 문제를 해결했다.
- 주어진 근무표에서 각 인원이 맡은 근무 시간을 HashMap에 저장하고,
- 이를 통해 근무 시간이 최대 12시간 차이 나는지 검증하는 과정을 구현했다.
- 이 문제에서는 반복문을 통해 각 시간대에 할당된 인원의 근무 시간을 누적해야 했고,
- 빈 근무 시간대는 무시하면서 총 근무 시간을 계산해야 했다.
4) 오늘의 회고
문제점
- 문제에서 제시된 근무 시간이 다르다는 점과,
- 각 시간대를 누적하는 방식에서 발생하는 변수명을 명확히 지정하는 것에 어려움이 있었다.
- 특히 하루의 근무표가 4개의 줄로 표현되기 때문에
- 각 주별로 4줄을 순회하며 근무자를 확인하고, 이를 각 시간대별로 구분하여 누적하는 과정이 필요했다.
해결방법
- 각 시간대에 해당하는 시간만큼의 근무 시간을 누적하기 위해 HashMap<String, Integer>를 사용하여 각 근무자에 대한 근무 시간을 기록했다.
- 이를 통해 근무 시간이 입력될 때마다 인원을 Key, 근무시간을 value로 하여 누적하고,
- 나중에 공평성 조건인 12시간 이하 차이 조건을 만족하는지 체크하였다.
새롭게 알게 된 점
- HashMap을 이용하여 근무 시간을 누적하는 것이 간편하고, 특정 기준을 가지고 근무자 이름별 시간을 관리하는 데 효과적이라는 점을 알게 되었다.
- 또한, 이 문제를 통해 각 시간대별로 근무 시간을 다르게 처리하는 방법과 각 시간대에 대한 누적 관리의 필요성을 깨달았다.
내일 학습 목표
- HashMap을 더 다양한 방식으로 활용하는 방법과, 데이터를 그룹핑하고 관리하는 방법을 학습할 예정이다.
- 특히 데이터 관리와 시간 누적 방식에 있어 최적화된 방법들을 탐구하고,
- 자바의 Collection Framework 활용에 더 익숙해지고자 한다.
5) 추가 문제
미들러 - 촌수계산
https://www.acmicpc.net/problem/2644
챌린저 - 녹색 옷 입은 애가 젤다지?
반응형
'coding_test' 카테고리의 다른 글
[99클럽 4기 코테 스터디 TIL 10일차] 폰켓몬 (feat. HashSet, Math.min()) (1) | 2024.11.06 |
---|---|
[99클럽 4기 코테 스터디 TIL 9일차] 민균이의 비밀번호 (feat. HashSet, StringBuilder) (0) | 2024.11.06 |
[99클럽 4기 코테 스터디 TIL 7일차] 전주 듣고 노래 맞히기 (feat. 해시맵) (1) | 2024.11.03 |
자바의 List 객체와 String 배열의 차이 및 출력하는법 (0) | 2024.11.02 |
[99클럽 4기 코테 스터디 TIL 6일차] 할리갈리 (feat. 해시맵, BufferedReader, Bufferedwriter, HashMap.containsValue()) (0) | 2024.11.02 |