본문 바로가기
내가 공부하려고 올리는/알고리즘

백준 구현 알고리즘 - 11723번(파이썬)

by 결딴력 2022. 5. 11.
반응형

문제

 

 

풀이

더보기

import sys

n = int(sys.stdin.readline())
s = set()

for _ in range(n) :
  array = sys.stdin.readline().strip().split()
  
  if len(array) == 1:
      if array[0] == "all":
          s = set([i for i in range(1, 21)])
      else:
          s = set()
  
  else:
      func, x = array[0], array[1]
      x = int(x)

      if func == "add":
          s.add(x)
      elif func == "remove":
          s.discard(x)
      elif func == "check":
          print(1 if x in s else 0)
      elif func == "toggle":
          if x in s:
              s.discard(x)
          else:
              s.add(x)

 

 

후기

여태까지 푼 문제들 중에 가장 많이 틀리고

가장 많은 오류를 발생시킨 문제인 것 같다 ㅎㅎ..

 

실제 오류 내역인데

런타임 에러부터 시간 초과, 메모리 초과까지 정말 다양하게 오류를 냈다.. ㅎㅎ

 

결과적으로 내 코드는 돌아가는데

오류가 나니까 어떻게 해야할 지 답답했던 문제였던 것 같다.

 

우선 이 문제에서 처음 set에서 데이터를 지우는데 'remove'를 사용했는데

이 경우 집합에 지우려는 데이터가 없는 경우 런타임 에러를 띄운다고 한다.

 

'discard'의 경우 해당 데이터가 없어도 오류가 발생하지 않는다고 하니

코테에서는 런타임 에러에 대비해 discard를 사용하려고 해야할 것 같다.

 

입력을 여러 개 받지 않아서 처음에 sys 라이브러리를 사용하지 않고

입력을 그냥 input()으로 받았더니 시간초과가 발생하여 sys 라이브러릴 사용하여

sys.stdin.readline()으로 입력을 받았더니 시간초과 문제는 해결할 수 있었고,

 

메모리 초과의 경우 초반에는 다음과 같이 for문을 두 번 사용해서 코드를 작성했는데

더보기

import sys

n = int(sys.stdin.readline())
s = set()
array = []

for i in range(n) :
  array.append(list(sys.stdin.readline().strip().split()))

for i in range(len(array)) :
  if array[i][0] == 'add' :
    s.add(int(array[i][1]))
  elif array[i][0] == 'check' :
    if int(array[i][1]) in s :
      print(1)
    else :
      print(0)
  elif array[i][0] == 'remove' :
    s.discard(int(array[i][1]))
  elif array[i][0] == 'toggle' :
    if int(array[i][1]) in s :
      s.discard(int(array[i][1]))
    else :
      s.add(int(array[i][1]))
  elif array[i][0] == 'all' :
    for i in range(1, 21) :
      s.add(i)
  else :
    s -= s

for문을 두 번 돌리면서 메모리가 오바되는 것 같아서

for문을 위에 풀이처럼 한 번으로 바꾸니까 문제가 해결됐다.

반복문 사용은 가급적 줄일 수 있는 방향으로 코드를 작성해야 할 것 같다.

반응형

댓글