-
[BOJ] 사이버개강총회알고리즘 2023. 12. 23. 21:15
문제
보영이는 알고리즘 동아리 HI-ARC를 운영하고 있다.
보영이와 운영진 일동은 20년도에 입학하는 신입생들을 맞이하기 위해 열심히 준비를 해왔으나, 전염병의 유행이 악화된 나머지 정부에서는 “사회적 거리두기”를 선언했고
그에 따라 학교에서는 교내 모든 동아리에 오프라인 모임을 자제하라는 공지를 하기에 이르렀다. 오프라인에서 모임을 자제하라는 권고가 나온 어려운 상황에도 불구하고,
보영이는 기지를 발휘하여 개강총회를 미튜브 스트리밍으로 대체하는 결정을 하게 된다.
하지만, 미튜브 스트리밍으로 개강총회를 하게 될 경우, 아래와 같은 문제가 있었다.
누가 개강총회에 왔는지 알 수 없다.
누가 개강총회 자리에 끝까지 남아있었는지 알 수 없다.
어떤 사람이 개강총회 스트리밍을 단순히 틀어놓기만 했는지 알 수 없다.
이런 문제를 해결하기 위해서, 다음과 같이 출석부를 관리하기로 결심했다.
개강총회를 시작하기 전에, 학회원의 입장 확인 여부를 확인한다. 학회원의 입장 여부는 개강총회가 시작한 시간 이전에 대화를 한 적이 있는 학회원의 닉네임을 보고 체크한다.
개강총회를 시작하자마자 채팅 기록을 남긴 학회원도 제 시간에 입장이 확인된 것으로 간주한다.
개강총회를 끝내고 나서, 스트리밍을 끝낼 때까지 학회원의 퇴장 확인 여부를 확인한다. 학회원의 퇴장 여부는 개강총회가 끝나고 스트리밍이 끝날 때까지 대화를 한 적이 있는 학회원의 닉네임을 보고 체크한다.개강총회가 끝나자마자 채팅 기록을 남겼거나, 개강총회 스트리밍이 끝나자마자 채팅 기록을 남긴 학회원도 제 시간에 퇴장이 확인된 것으로 간주한다.
단, 00:00부터는 개강총회를 시작하기 전의 대기 시간이며, 개강총회 스트리밍 끝난 시간 이후로 남겨져 있는 채팅 기록은 다른 스트리밍 영상의 채팅 기록으로 간주한다.
이 때, 입장부터 퇴장까지 모두 확인된 학회원은 전부 몇 명인가?
풀이
우선 Map에 개강총회에 참석한 인원들을 put하도록 하였다.
이후, 채팅 시간이 개총종료와 스트리밍 종료 시점이 되면 해당 map에서 key를 찾아 1을 감소시키도록 하였고,
마지막에 value값이 0 이하이면 출석처리가 된 것으로 간주하도록 하였다.
중요한 점은 채팅이 여러번 쳐질 수 있다는 것이다.
따라서 value감소시 0 이하가 될수 있음을 알아야 한다.
Map대신 Set을 이용하여 이를 구현해도 괜찮을 것 같다.다만 시간 하나하나를 모두 파싱을 해버리는 멍청한 행위를 하였다.
시, 분을 모조리 파싱하여 경우에 따라 모두 조건식을 세우는 풀이도 했었는데 조건식이 너무 복잡하게 나왔다.
생각해보니 모두 파싱하는 것이 아니라 String메소드중 compareTo를 이용한다면 사전순이므로 파싱없이 비교가 가능하단 것을 망각하고 있었다.
너무 고정관념에면 사로잡히지 말자는 큰 뜻을 얻었다.import java.util.*; import java.lang.*; import java.io.*; class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input = br.readLine(); String[] str = input.split(" "); Map<String, Integer> map = new HashMap<>(); String start = str[0]; String end = str[1]; String streamEnd = str[2]; while((input = br.readLine()) != null && !input.equals("")) { str = input.split(" "); String time = str[0]; if (time.compareTo(start) <= 0) { map.put(str[1], 1); continue; } if (time.compareTo(end) >= 0 && time.compareTo(streamEnd) <= 0) { if (map.get(str[1]) != null) { map.put(str[1], map.get(str[1]) - 1); } } } int answer = 0; for(String name : map.keySet()) { if (map.get(name) <= 0) { answer++; } } System.out.println(answer); } }
728x90'알고리즘' 카테고리의 다른 글
[BOJ] 체스판 다시 칠하기 (0) 2024.02.05 [BOJ] 배열합치기 (0) 2024.01.13 [BOJ] 배부른 마라토너 (0) 2023.12.21 [BOJ] 쉽게 푸는 문제 (2) 2023.12.21 [BOJ] 연산자끼워넣기 (0) 2023.12.20