코테/BOJ

백준 18869 [멀티버스 II] 파이썬

동 캄 2025. 6. 15. 16:17
반응형

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

 

#백준 18869 멀티버스 II
import sys
from bisect import bisect_left
M,N=map(int,sys.stdin.readline().split())
univs=[]
indexes=[[] for _ in range(M)]
for i in range(M):
    univ=list(map(int,sys.stdin.readline().split()))
    univs.append(univ)  
    for v in univ:
        idx=bisect_left(univ,v)
        indexes[i].append(idx)
ans=0
for i in range(M):
    for j in range(i+1,M):
        if indexes[i]==indexes[j]:
            ans+=1

# print(indexes)
print(ans)

결국 이 문제의 핵심은 우주별로 행성들의 크기 서열이 같은지를 파악하는 문제였다.

 

이를 위해 이분 탐색을 이용해서 그 순서를 파악한다. (정렬되지 않았으므로, 정확한 순서는 아님. 잘못된 순서대로 순서가 작성됨)

(잘못된 순서도 상대적인 순서로 볼 수 있으므로 정답은 맞음)

 

딕셔너리를 이용해서 더 깔끔하게 푸신분의 코드를 첨부한다.

import sys
input = sys.stdin.readline
from collections import defaultdict

# m: 우주의 수 (각 우주는 행성 정보를 가짐)
# n: 각 우주에 있는 행성의 수
m, n = map(int, input().split())

# 같은 구성(정렬된 순위 기준)을 갖는 우주의 벡터를 key로, 개수를 세는 딕셔너리
universe = defaultdict(int)

for _ in range(m):
    # 한 우주의 행성 정보를 입력받음
    planets = list(map(int, input().split()))
    
    # 행성 정보를 정렬 후 중복 제거 (행성의 고유 크기 값들 정렬)
    sortedPlanets = sorted(list(set(planets)))
    
    # 행성 크기에 따라 정렬된 순위(rank) 매기기 (작은 값일수록 낮은 순위)
    rank = {sortedPlanets[i] : i for i in range(len(sortedPlanets))}
    
    # 원래 행성 배열을 rank에 따라 변환한 튜플 생성
    # 즉, 행성의 상대적인 크기 순서 벡터 생성
    vector = tuple([rank[i] for i in planets])
    
    # 해당 순서 벡터의 출현 횟수 증가
    universe[vector] += 1

# 같은 순서 벡터를 가진 우주 쌍의 수 계산
total = 0
for count in universe.values():
    # 같은 벡터를 가진 우주들 중 2개를 선택하는 경우의 수: 조합 count C 2
    total += (count * (count - 1)) // 2

# 결과 출력
print(total)
반응형