흙금이네 블로그

[BOJ] 19583 - 싸이버개강총회 (Python, JavaScript) 본문

알고리즘

[BOJ] 19583 - 싸이버개강총회 (Python, JavaScript)

흙금 2023. 1. 25. 17:54

 

 

아이디어

 

시간에 맞게 입장과 퇴장이 모두 확인된 학회원들을 찾는다.

 

 

풀이 #1 (Python)

 

개강총회 시작 시간 S, 개강총회 종료 시간 E, 스트리밍 종료 시간 Q를 모두 문자열로 입력 받는다.

테스트 케이스 수가 따로 주어지지 않으므로 try except문으로 입력이 주어지는 동안 while문을 반복한다.

시간은 T, 이름은 name에 문자열로 저장하고, T가 S 이하이면 딕셔너리 names에 name을 1로 저장한다.

T가 E 이상 Q 이하이면서 names에 값이 있으면 중복 계산 방지를 위해 해당 값을 0으로 바꾸고 결과값 res를 증가시킨다.

 

문자열의 대소 비교에서는 순서대로 각 문자열 문자들의 아스키 코드 값으로 대소 비교가 된다.

 

import sys

input = sys.stdin.readline

S, E, Q = input().split()
names = dict()
res = 0
while 1:
    try:
        T, name = input().split()
        if T <= S:
            names[name] = 1
        elif Q >= T >= E and names.get(name, 0):
            names[name] = 0
            res += 1
    except:
        break
print(res)

 

 

시간을 일일이 정수형으로 바꿔 비교했으나 문자열 그대로 대소를 비교할 수 있었다.

# 더 느린 코드
S, E, Q = input().split()
S = int(S[:2]+S[3:])
E = int(E[:2]+E[3:])
Q = int(Q[:2]+Q[3:])
names = dict()
res = 0
while 1:
    try:
        T, name = input().split()
        T = int(T[:2]+T[3:])
        if T <= S:
            names[name] = 1
        elif Q >= T >= E and names.get(name, 0):
            names[name] = 0
            res += 1
    except:
        break
print(res)

 

set 자료구조를 이용하여 문제를 풀 수도 있었다.

메모리는 확실히 더 적게 사용되고, 시간은 제출할 때마다 달랐으나 보통 더 느렸다.

# 메모리는 더 적게 사용되나 더 느린 코드
import sys

input = sys.stdin.readline

S, E, Q = input().split()
enter = set()
leave = set()
while 1:
    try:
        T, name = input().split()
        if T <= S:
            enter.add(name)
        elif Q >= T >= E:
            leave.add(name)
    except:
        break
print(len(enter&leave))

 

sys.stdin.readlines로 입력을 받을 수도 있으나 try except문을 사용하는 코드보다 메모리가 더 많이 사용되었다.

# 메모리가 더 많이 사용되는 코드
import sys

S, E, Q = input().split()
names = dict()
res = 0
for case in sys.stdin.readlines():
    T, name = case.split()
    if T <= S:
        names[name] = 1
    elif Q >= T >= E and names.get(name, 0):
        names[name] = 0
        res += 1
print(res)

 

 

 

풀이 #2 (JavaScript)

 

풀이 #1 코드와 마찬가지 방식으로 동작한다.

자바스크립트에서는 Set이라는 집합 자료구조가 있고, has 메서드로 집합에 해당 값이 포함되어 있는지 확인한다.

 

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');

let [S, E, Q] = input[0].split(' ');
let enter = new Set();
let leave = new Set();
for (let i=1; i<input.length; i++) {
    let [T, name] = input[i].split(' ');
    if (T <= S) enter.add(name);
    else if (T >= E && T <= Q && enter.has(name)) leave.add(name);
}
console.log(leave.size);

 

Comments