Insights/For KR

백준 3052번: "{}"은 집합? 딕셔너리?

funczun 2024. 11. 2. 11:02
빈 리스트 생성의 경우

 리스트에 어떠한 값을 추가할 예정이라고 하더라도, 프로그램이 정상적으로 작동하기 위해서는 해당 리스트를 미리 생성해 초기화해 놓아야 한다. 파이썬에서 빈 리스트는 기본적으로 "[]"을 입력해 생성한다. 아래 두 코드들은 실제로 내가 백준 문제를 풀며 리스트를 초기화한 사례이다.

# https://www.acmicpc.net/problem/10871

import sys

N, X = map(int, sys.stdin.readline().split())
A = list(map(int, sys.stdin.readline().split()))
less_than = []

for i in A:
    if i < X:
        less_than.append(i)

# To convert each element to a string, you should use the map function
result = map(str, less_than)

print(' '.join(result))
# https://www.acmicpc.net/problem/2562

import sys

inputs = []

for i in range(9):
    num = int(sys.stdin.readline())
    inputs.append(num)

max_num = max(inputs)

print(max_num)
print(inputs.index(max_num) + 1)

 

"{0}"은 집합, "{}"은 딕셔너리

 백준 3052번 문제를 풀며 실제로 집합 개념을 사용해야 할 때가 왔다. 나는 별생각 없이 집합은 "{}" 형태로 나타나니까 "{}"을 입력해 집합을 초기화해주려고 했다. 그러나 for문에서 집합에 요소를 추가하는 add 함수가 정상적으로 작동하지 않았다. VS Code에서 지원하는 문법 강조 기능을 통해 무언가 잘못되었다는 건 직관적으로 알 수 있었다.

# https://www.acmicpc.net/problem/3052

import sys

rest = {}

for i in range(10):
    n = int(sys.stdin.readline())
    rest.add(n % 42)

print(len(rest))

 오류의 원인은 위에 보이는 "rest = {}"가 집합이 아닌 빈 딕셔너리를 생성하는 코드이기 때문이다. 딕셔너리는 add 메소드를 사용할 수 없다. 딕셔너리와 집합 모두 "{}"를 사용하지만, 딕셔너리는 "{key1: value1, key2: value2}" 형식으로, 집합은 "{value1, value2}" 형식으로 이루어져 있다. 핵심은 "{}" 안이 빈 경우 기본적으로 딕셔너리 취급한다는 것이고, 만약 빈 집합을 생성하고 싶다면 "set()"을 사용해야 한다는 것이다.

# https://www.acmicpc.net/problem/3052

import sys

rest = set()

for i in range(10):
    n = int(sys.stdin.readline())
    rest.add(n % 42)

print(len(rest))