알고리즘/구현

[백준 19583] 싸이버 개강 총회 -구현, 문자열, HashSet

제이G 2023. 2. 7. 09:51

https://www.acmicpc.net/problem/19583

 

19583번: 싸이버개강총회

첫번째 줄에는 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q가 주어진다. (00:00 ≤ S < E < Q ≤ 23:59) 각 시간은 HH:MM의 형식으로 주어진다. 두번째 줄부터는

www.acmicpc.net

 

[설계]

1. (00:00 ~ S) in HashSet에 입장체크를 한다.

2. (E ~ Q) out HashSet에 퇴장체크를 한다.

3. 입장한 사람들에 대해 퇴장했는지 확인한다.

시간복잡도: O(채팅기록) = O(100,000)

 

※주의: (E ~ Q)입력에 대해 입장체크 in의 존재여부로 바로 확인하면 안된다. (채팅 중복이 있기 때문)

 

[알게된 내용]

String.compareTo()

출처: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html

 

  1. 두개의 String을 사전적으로 비교한다.
  2. Strings에 각 Character의 Unicode를 기반으로 비교한다.
  3. 매개변수인 String보다 사전적으로 앞서있는 경우 -> 음수
  4. 매개변수인 String보다 사전적으로 뒤에 있는 경우 -> 양수
  5. 매개변수인 String과 사전적으로 동일한 경우 -> 0
    (compareTo가 0을 리턴하고, equals가 true을 리턴하는 경우)

사전순의 정의

  1. 두 String이 다르다 -> 동일한 index의 character이 서로 다른 경우, 길이가 다른경우
  2. 동일한 index의 character가 서로 다른 경우, 두 character의 Unicode의 차이로 비교
    this.charAt(index) - argumentString.charAt(index)
  3. 동일한 index에 대한 비교가 불가한 경우, 두 String의 길이로 비교
    this.length() - argumentString.length()

 

정리

  1. 두 String이 동일한 경우 0을 리턴
  2. 기본적으로는, 동일한 index의 character의 unicode를 바탕으로 비교
    this.charAt(index) - argumentString.charAt(index)
    this의 특정 문자가 더 앞에있으면 사전적으로 앞서 있다.
  3. [abc], [abc9]와 같이, 동일한 index의 character 비교가 불가한 경우 길이를 바탕으로 비교
    this.length() - argumentString.length()
    this의 길이가 짧으면 사전적으로 앞서 있다.
  4. 위의 사전순 비교를 통해, stringA.compareTo(stringB)의 결과가
    음수이면 -> stringA가 사전적으로 앞서 있다.
    양수이면 -> stringA가 사전적으로 뒤에 있다.
    0이면 -> stringA가 사전적으로 같다.