[백준/Python] 7785번 회사에 있는 사람

2025. 2. 27. 14:39·알고리즘문제풀이

문제

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


문제 이해

이 문제는 입력값에 enter가 들어가면 리스트에 삽입하고 입력값에 leave가 들어가면 리스트에서 제거하는 문제이다.

입력값을 띄어쓰기를 기준으로 나눠준 후, 기준에 따라 리스트에 삽입과 제거를 한다. 그리고 사전 역순으로 정렬해 주면 된다.


문제 풀이(시간 초과)

# 시간 초과
n = int(input())
li = []
for _ in range(n):
    people = input()
    ps = people.split()
    if ps[-1] == 'enter':
        li.append(ps[0])
    elif ps[-1] == 'leave':
        li.remove(ps[0])
# 정렬
li = sorted(li)[::-1]
for i in li:
    print(i)

 

li라는 리스트를 만든 후, 문제를 풀어보니 시간초과가 되었다.

'li.append(ps[0])'는 리스트에서 특정 값을 찾아 삭제하는 연산인데 이 과정에서 시간초과가 발생한 것이다.

시간초과를 해결하기 위해 리스트 대신 set()을 사용해서 풀어보았다.

 

List vs Set 시간복잡도

List의 시간복잡도는 O(n), Set의 시간복잡도는 O(1)이다.

 

Set이 효율적인 이유는 파이썬에서는 Set가 해시 함수와 해시 테이블로 구현되어 있기 때문이다.

 

해시란?

  • 임의의 크기를 가진 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것

 

따라서, Set은 해시 테이블 덕분에 데이터를 빠르게 검색, 삽입, 삭제를 할 수 있어서 효율적인 자료구조이다.

반면 List는 순차적으로 값을 찾기 때문에 시간이 오래걸리는 자료구조이다.

즉, List보다 Set이 시간복잡도가 빠르다.


문제 풀이(정답) 

# 정답 : remove() 사용
n = int(input())
li = set()
for _ in range(n):
    people = input()
    ps = people.split()
    if ps[-1] == 'enter':
        li.add(ps[0])
    elif ps[-1] == 'leave':
        li.remove(ps[0])
        # li.discard(ps[0])
 
# 정렬
li = sorted(li)[::-1]
for i in li:
    print(i)

 

Set()에서는 append()함수를 사용하지 못하므로 데이터를 추가할 때 append() 대신 add()를 사용해 주었다.

삭제할 때는 remove()와 discard()를 이용할 수 있는데 2가지 함수에는 차이점이 존재한다.

remove() vs discard()

remove() : 반드시 삭제해야 하는 값이 존재하는 것이 보장될 때 사용

discard() : 값이 존재할 수도 있고, 없을 수도 있는 경우 사용

 

이 문제의 경우에는 2가지 경우 모두 사용 가능하다.

 

블로그를 작성하며, Set()의 개념에 대해 더 확실하게 알게되었다.

저작자표시 비영리 변경금지 (새창열림)

'알고리즘문제풀이' 카테고리의 다른 글

[백준/Python] 28278번 스택 2  (0) 2025.03.04
[백준/Python] 11652번 카드  (0) 2025.02.28
[백준/Python] 2563번 색종이  (0) 2025.02.26
[백준/Python] 2606번 바이러스  (0) 2025.02.25
[백준/Python] 11659번 구간 합 구하기 4  (0) 2025.02.21
'알고리즘문제풀이' 카테고리의 다른 글
  • [백준/Python] 28278번 스택 2
  • [백준/Python] 11652번 카드
  • [백준/Python] 2563번 색종이
  • [백준/Python] 2606번 바이러스
jungyn
jungyn
jungyn 님의 블로그 입니다.
  • jungyn
    jungyn 님의 블로그
    jungyn
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 알고리즘문제풀이 (31)
      • 제로인턴 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    18110
    스택 수열
    counter
    수들의 합 2
    1629
    DP
    2563
    스택
    스택 2
    카드1
    시간초과
    너비우선탐색
    2606
    11729
    2108
    2차원행렬
    후기
    백준
    다이나믹프로그래밍
    BFS
    2161
    통계헉
    교점개수
    프로그래머스
    28278
    사전직무교육
    SYS
    solved.ac
    제로인턴
    1847
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
jungyn
[백준/Python] 7785번 회사에 있는 사람
상단으로

티스토리툴바