오늘 풀어볼 문제는 '내 집 마련하기' 이다.
예전에 서강대학교 프로그래밍 대회에서 1번 문제로 나왔었던 문제인데, 조금 복잡했던 구현 문제이다.
우선적으로 조금 어려운 부분은, '문제를 정확하게 읽어야 된다'는 점이다.
문제에 주어진 표현은 i번째 집에 A_i번 사람이 배정되어있다고 하는데,
즉 문제에 표현된 방식은 1번과 같은, 집 기준이다.
하지만 문제에서 sorting 해야하는 것은 L번 사람부터 R번 사람, 즉 사람 기준이다.
그렇기 때문에, 기준을 사람으로 변경해주어야 한다.
먼저 이후 정렬을 통해서, 작은 집의 번호를 가진 사람이 작은 집에 살고, 큰 집의 번호를 가진 사람이 높은 번호의 집에 살아야 최적의 세금 감면 효과가 이루어지기 때문에, 오름차순으로 L번 사람부터 R번 사람의 집들을 정렬한다.
이후 다시 수열 A를 작성해야 하기 때문에, 다시 집 기준으로 기준점을 옮긴다.
여기서 효과적으로 사용할 수 있는 파이썬의 함수는 바로 enumerate이다.
enumerate는 특정 리스트를 (인덱스, 값)으로 변경시켜준다.
즉,
data=[a,b,c]
new_data=enumerate(data)
for i in new_data:
print(i)
를 하면,
(0,'a')
(1,'b')
(2,'c')
가 출력된다.
이를 이용해서, 서로의 인덱스와 값을 변경해주어서 쉽게 기준을 변경할 수 있다.
from copy import deepcopy
n=int(input())
data=[0]+list(map(int,input().split()))
house=[0 for _ in range(n+1)]
for index,person in enumerate(data):
house[person]=index
m=int(input())
for _ in range(m):
left,right=map(int,input().split())
temp=deepcopy(house)
temp=temp[:left]+sorted(temp[left:right+1])+temp[right+1:]
answer=[0 for _ in range(n+1)]
for i,person in enumerate(temp):
answer[person]=i
print(*answer[1:])
'Computer Science > Algorithm' 카테고리의 다른 글
[Python 3] BOJ 20955 민서의 응급 수술 (0) | 2024.06.03 |
---|---|
[Python 3] BOJ 30627 삼월 초하루 (0) | 2024.05.09 |
[Python 3] BOJ 25419 정수를 끝까지 외치자 (1) | 2024.04.28 |
[Python 3] BOJ 30205 전역 임무 (0) | 2024.04.26 |
[Python 3] LEETCODE 2962. Count Subarrays Where Max Element Appears at Least K Times (2) | 2024.03.29 |