백준 1026 - 보물 (Python3)
코드
B 배열을 재배열하여 푸는 경우 (정답 인정이 된다…)
n = int(input())
# 배열 A
a = list(map(int, input().split()))
# 배열 B
b = list(map(int, input().split()))
# 함수 S를 적용할 배열
answer = []
# 함수 S 구현
def _S(a, b, answer):
a.sort()
b.sort(reverse=True)
for i in range(n):
answer.append(a[i] * b[i])
print(sum(answer))
_S(a, b, answer)
B 배열을 재배열하지 않고 푸는 경우
n = int(input())
# 배열 A
a = list(map(int, input().split()))
# 배열 B
b = list(map(int, input().split()))
# 함수 S를 적용할 배열
answer = []
# 함수 S 구현
def _S(a, b, answer):
# 배열 A 오름차순 정렬
a.sort()
for i in range(n):
# B에 곱해줄 A의 원소
_a = a[i]
# B에서 가장 큰 값의 인덱스 번호
max_idx = b.index(max(b))
# 가장 큰 값을 pop하여 _b에 담아줌
_b = b.pop(max_idx)
# 오름차순으로 정렬된 A의 원소 * B의 가장 큰 값을
# 각각 곱하고 answer에 저장
answer.append(_a * _b)
# 그 합을 출력
print(sum(answer))
_S(a, b, answer)
문제 해설
문제에 배열 B는 재배열하여서는 안 된다는 조건이 있지만, 건드려도 정답이 인정이 되기는 한다. 하지만 문제의 요구사항에 부합하지 않으므로 B를 건들이지 않고 해결하는 코드 또한 작성하였다.
문제의 핵심 로직과 이를 구현하는 방법은 아래와 같다.
-
핵심 로직 : 배열 A의 가장 작은 값과 배열 B의 가장 큰 값을 서로 곱하게 A를 정렬한다.
-
구현
- 배열 A : 오름차순으로 정렬
- 배열 B : 가장 큰 값의 인덱스를 가져와 해당 인덱스로 가장 큰 값을 pop하고 변수에 담음
- 그 후, A의 요소와 B에서 pop한 요소를 순서대로 곱해준 후, answer 리스트에 저장
- answer 리스트의 합을 sum() 함수로 도출
위의 과정을 코드화 시키면 두번째 코드와 동일하다. 문제의 요구사항에 부합하게 문제를 푸는 것이 가장 중요하므로 이를 어기지 않고 그 요구사항들을 확실하게 파악할 수 있는 스킬을 연습해야겠다.
댓글남기기