시간 제한 | 메모리 제한 | 문제 티어 |
1 초 | 256 MB | 실버 V |
📜 문제
상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.
각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.
상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
📥입력
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 10^6) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다. 사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
📤출력
현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.
💡풀이
이번 풀이도 14425번 문제(https://juni-tech.tistory.com/26) 를 풀었을 때와 마찬가지로 Set를 이용한 코드와 Dictionary를 이용한 코드 두가지 풀이가 존재한다. Dictionary를 이용한 풀이는 타 블로그에서 많이 설명되고 있고 Set를 이용한 풀이는 안보이길래 Set를 사용한 풀이를 알려줄려고 한다.
맨 처음에 내가 풀었던 풀이는 set() 함수를 사용해 log 변수에 저장하고, n값만큼 반복문 돌려 이름과 통근 여부(enter, leave) 를 입력 받는다. 그다음에 enter이면 그 사람 이름를 log에 add 하고, leave이면 log에서 remove 한다. 그렇게 해서 최종 log를 list화 시키고, reversed(역순)해서 reverse_log 변수에 리스트를 저장한다. 마지막으로 반복문을 사용해 reverse_log를 순회해서 하나씩 출력를 해주면 되는것이다..! 해당 코드는 아래와 같다.
import sys
input = sys.stdin.readline
n = int(input())
log = set()
for _ in range(n):
name, check_commuting = map(str, input().rstrip().split())
if check_commuting == 'enter':
log.add(name)
elif check_commuting == 'leave':
log.remove(name)
reverse_log = reversed(list(log))
for current_staff in reverse_log:
print(current_staff)
그러나 이 풀이로 제출하니까 틀린 오답이라고 나온다. 엥..😫 분명 결과는 맞게 출력되어 나오는데..
그래서 마지막 for문으로 출력하는 부분을 살짝 고쳤다. 처음에 나는 sorted() 함수가 Set() 함수에는 사용 불가일 줄 알았는데 가능하다는 것을 알게 되어 굳이 reversed, list을 쓰지 않고 sorted() 함수를 사용해서 풀이를 했다.
import sys
input = sys.stdin.readline
n = int(input())
log = set()
for _ in range(n):
name, check_commuting = map(str, input().rstrip().split())
if check_commuting == 'enter':
log.add(name)
elif check_commuting == 'leave':
log.remove(name)
log = sorted(log, reverse=True)
print('\n'.join(log))
이렇게 하니까 정답으로 뜬다..! 😊 왜 첫 번째 코드는 오류가 뜨는지 한참 찾아보았는데 해결했다..!
이유는 단순하다. set에는 순서가 없기에 들어온 순서가 보존되지 않고 이에 따라 출력하면 아무 순서로 나오게 된다.
여기서 reversed()를 사용하면 뒤집어진 아무 순서로 나오게 되는 것이다. 그리고 덧붙이자면, reversed()에는 정렬 같은 기능은 없고 그냥 있던 순서를 뒤집은 리스트를 반환할 뿐이다.
대신 sorted()는 정렬을 해서 새로 리스트를 만들어주기 때문에 Set에서 망가진 순서와 관계없이 사용할 수 있는 것이다.
정리하면 정렬할 때 원래 순서를 유지해야 하는 경우는 (물론 그럴 이유도 없겠지만) Set에 저장하면 안된다..!
<개념 정리>
Set(집합) : 파이썬 2.3부터 지원하기 시작한 자료형으로, 집합에 관련된 것을 쉽게 처리하기 위해 만든 자료형
- 중복을 허용하지 않는다.
=> 중복을 허용하지 않는 특징 때문에 set은 자료형의 중복을 제거하기 위한 필터로 종종 사용된다.
- 순서가 없다.(Unordered)
=> 넣은 순서대로 출력되지 않는다.
- set()를 사용하며, 중괄호로 출력된다.
- 변하기 쉬운(mutable) 객체이다.
- Set 안에는 여러가지 형태를 함께 넣을 수 있다. 그러나 값이 변할 수 있는 mutable 자료형은 넣을 수가 없다.
- 보통 데이터를 분석할 때 list의 중복의 제거하기 위한 용도로 list(set(value))를 많이 사용한다.
https://wikidocs.net/1015
<Sort() vs Sorted()>
1) 공통점
- 모두 정렬을 위해 사용한다.
2) Sort()
- List Method로 리스트명.sort( ) 형식으로 사용한다.
- List의 원본 데이터를 수정한다.
=> 새로운 복사본을 만들지 않으므로 Sorted()에 비해 수행 속도가 빠르다.
3) Sorted()
- Sorted()는 내장함수이며, List 외 다른 iterable한 객체에서 사용할 수 있다.
- sorted(리스트명) 형식으로 사용한다.
- 원본 데이터는 그대로이고 정렬된 데이터를 반환한다.
'CodingTest > Baekjoon' 카테고리의 다른 글
[백준/Python] 10816번 : 숫자 카드 2 (0) | 2023.06.03 |
---|---|
[백준/Python] 1620번 : 나는야 포켓몬 마스터 이다솜 (0) | 2023.06.02 |
[백준/Python] 14425번 : 문자열 집합 (0) | 2023.05.31 |
[백준/Python] 10815번 : 숫자 카드 (0) | 2023.05.30 |
[백준/Python] 2563번 : 색종이 (0) | 2023.05.29 |