문제
https://www.acmicpc.net/problem/1270
드디어 전쟁은 전면전이 시작되었고, 서로 땅을 따먹기 시작했다.
현재 여러 지역은 한창 전쟁이 벌어지고 있는 상황인데, 어느 지역은 거의 전쟁이 마무리 단계로 가고 있다.
하지만 당신은 군대를 보낼 때 적군을 혼란시키기 위해서 우리 나라의 군대라는걸 표시하지 않고, 군대의 번호로 표시했다.
어느 땅에서 한 번호의 군대의 병사가 절반을 초과한다면 그 땅은 그 번호의 군대의 지배하에 놓이게 된다.
이때, 각 땅들을 지배한 군대의 번호를 출력하여라. 만약, 아직 전쟁이 한창중인 땅이라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.
입력
첫째 줄에는 땅의 개수 n(n<=200)이 주어진다. 그리고 두 번째 줄에서 n+1번째 줄에는 제일 처음에 숫자 Ti(i번째 땅의 병사수, Ti<=100,000)와, Ti개의 숫자 (각각 병사의 군대 번호)가 주어진다. i번째 땅의 j번째 병사 번호 Nij가 주어진다. ( | Nij | <= 2^31 )
출력
첫째 줄에는 각각의 땅의 상태를 순서대로 출력한다. 만약 땅이 지배가 되어있다면 그 지배한 병사의 번호를 출력하고, 아니라면 “SYJKGW”을 쌍 따옴표 없이 출력한다.
풀이
이 문제는 파이썬으로 풀게 된다면.. defaultdict를 사용하면 금방 풀 수 있다. 사실 나는 쓸 줄 몰랐었기 때문에...(제대로) 이번 기회에 정리하면서 확실하게 이해를 해보고자 한다.
일단 코드부터 풀이하자면...
import sys
from collections import defaultdict
input = sys.stdin.readline
n=int(input().strip())
for _ in range(n):
data = list(map(int, input().split()))
t = data[0]
s = data[1:]
count = defaultdict(int)
for i in s:
count[i] += 1
h = t//2
found = False
for i in count:
if count[i] > h:
print(i)
found = True
break
if not found:
print("SYJKGW")
이렇다! 값을 입력 받고 defaultdict를 이용해서 count[i]에다가 횟수를 저장한 다음에 길이 절반 보다 큰 count[i]가 있으면 found를 True로 바꿔주고 어떤 땅이 이겼는지 출력. 찾지 못하면 "SYJKGM"을 출력하면 된다. 근데 아마 이 코드... 다른 분 코드를 참고 했던 것 같은데...못찾겠다...
사실상 코드 자체는 defaultdict을 알면 이해가 되는 구조이므로, 추가적인 설명은 넘어가고...
시간복잡도
defaultdict을 알기 전에! 시간복잡도부터 생각해보면... O(n*t)일 것 같다. (테스트케이스 수*병사 수)
defaultdict
키가 존재하지 않아도 기본값을 자동으로 생성해주는 딕셔너리. 딕셔너리와 거의 동일하게 작동하지만, 좀 더 편리하게 사용할 수 있는 것 같다.
#import 해오기
from collections import defaultdict
#선언해주기
count = defaultdict(int)
위 문제에서 이 딕셔너리 사용 방법을 보면 어떻게 사용할지 좀 더 쉽게 이해할 수 있다.
for i in s:
count[i] += 1
print(count, count[1])
이렇게 print를 찍어보면...
이런 식으로 나온다. 그러니까 i가 key값 역할을 하고 뒤에 횟수가 추가되고 count[i]를 하게 되면 해당하는 key값의 값을 출력해주는 구조.
key값을 미리 만들어둘 필요없이 그때그때 필요한 key값을 추가해서 만들 수 있게 해주는 좋은 자료구조(확장 구현체)이다.
'백준 알고리즘' 카테고리의 다른 글
[Python] 백준 17124. 두 개의 배열 +) 이분탐색 정리! (4) | 2025.08.01 |
---|---|
[Python] 백준 6219. 소수의 자격 +) 에라토스테네스의 체 (2) | 2025.07.18 |
[Python] 백준 3048.개미 (2) | 2025.07.11 |
[Python] 백준 29767. 점수를 최대로 (1) | 2025.06.06 |
[Python] 백준 15815. 천재 수학자 성필 (1) | 2025.05.26 |