https://www.acmicpc.net/problem/19583
코드설명
해시맵(HashMap)을 활용합니다.
입장하는것은 한번만 확인하면 되므로, hashmap.put(name, 1); 로 접속했다는 기록을 남겨둡니다.
만약 채팅을 2번치더라도, 입장은 1번입니다.
퇴장하는 것은 만약 이전에 입장한 기록이 hashmap에 존재한다면(hashmap.containsKey(name)== true) 라면,
기존 입장값에서 -1 을 해줍니다.
이때, 만약 0 이하라면 더 이상 할 필요는 없지만 문제에서 구하는 것은 인원을 구하는 것이기 때문에
손쉽게 음수일경우 개강총회에 참석했다고 하면 됩니다.
처음에 hashmap.containsKey(name)==true)를 하지않고, hashmap.getOrDefault로 입장여부가 없어도 퇴장여부를 넣는 로직을 추가했었는데, containsKey로 입장여부가 있는 경우에만 처리해주어야 합니다.
코드
package Main;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
static int N, M, S, P, K, A, B, X;
static int answer = 0;
static int[] arr = new int[3];
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String str = st.nextToken();
arr[0] = Integer.parseInt(str.split("[:]")[0]) * 60*60 + Integer.parseInt(str.split("[:]")[1]) * 60;
str = st.nextToken();
arr[1] = Integer.parseInt(str.split("[:]")[0]) * 60*60 + Integer.parseInt(str.split("[:]")[1]) * 60;
str = st.nextToken();
arr[2] = Integer.parseInt(str.split("[:]")[0]) * 60*60 + Integer.parseInt(str.split("[:]")[1]) * 60;
HashMap<String, Integer> hashmap = new HashMap<>();
String input = "";
while( (input = br.readLine()) != null ) {
st = new StringTokenizer(input);
if(!st.hasMoreElements()) break;
str = st.nextToken();
String[] strSplit = str.split("[:]");
//시간대.
int time = Integer.parseInt(strSplit[0]) * 60 * 60 + Integer.parseInt(strSplit[1]) * 60;
String name = st.nextToken();
//입장확인여부 확인
if(time <= arr[0]) {
hashmap.put(name, 1);
}
//퇴장확인여부 확인
if(time >= arr[1] && time <= arr[2]) {
if(hashmap.containsKey(name) == true) {
hashmap.put(name, hashmap.get(name) - 1);
}
}
}
for(Map.Entry<String, Integer> entrySet : hashmap.entrySet()) {
// System.out.println("entrySet:"+entrySet.getKey()+"entrySet:"+entrySet.getValue());
if(entrySet.getValue() <= 0) {
answer += 1;
}
}
System.out.println(answer);
}
}
'알고리즘 > 해시를 사용한 집합과 맵' 카테고리의 다른 글
[백준] 1972 놀라운 문자열 - 해시셋(HashSet) + DFS(깊이우선탐색) JAVA (0) | 2024.08.13 |
---|---|
[백준] 1270 전쟁 - 땅따먹기 - 해시맵(HashMap) JAVA (0) | 2024.08.13 |
[백준] 22233 가희와 키워드 - HashSet(해시셋) JAVA (0) | 2024.08.12 |
[백준] 9536 여우는 어떻게 울지? - 해시셋(HashSet) JAVA (0) | 2024.07.25 |
[백준] 3273 두 수의 합 - HashSet(해시셋) + 정렬(Sort) + 투포인터(Two Pointer) JAVA (0) | 2024.07.23 |