Skip to content

Latest commit

 

History

History
65 lines (52 loc) · 2.29 KB

1026.md

File metadata and controls

65 lines (52 loc) · 2.29 KB

백준 1026번 보물

1026


코드 설명

  • A[i] * B[i] 값들의 합이 최소가 되기 위해서는 A의 가장 작은 값과 B의 가장 큰 값이 곱해져야 한다.(그 반대도 가능 A의 가장 큰 값과 B의 가장 작은 값)
  • 리스트 안에는 중복된 값이 있으므로 중복값을 주의해서 계산해야 한다.(계산한 값은 삭제하거나 아예 나올 수 없는 값으로 초기화 시켜줌으로써 배제하기)

소스코드

  • 메모리 : 30864 KB
  • 시간 : 72 ms
n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
answer = 0

for i in range(n):
    a = min(A)
    b = max(B)
    answer += a*b
    del A[A.index(a)]
    del B[B.index(b)]

print(answer)

오답 노트

  • 배열 B는 재정렬을 하면 안된다고 문제에 조건으로 나와있었기 때문에 B의 값들을 b에 옮긴 뒤 b를 정렬해 정렬한 위치의 값인 인덱스를 사용해 풀려고 시도했다. -> 코드가 복잡해짐
  • 문제에는 재정렬하지 말란 조건이 있지만 문제를 푸는데 있어 보다 쉽고 간편하게 푸는 방법으론 A와 B를 각각 내림차순과 오름차순(또는 오름차순과 내림차순)으로 정렬한 뒤 곱해 더하는 것이 더 편하다.
  • 로직이 복잡해짐에 따라 오류가 발생하고 그 오류를 발생하기가 어려운 것 같다. 이 코드도 로직이 복잡해짐에 따라 오류가 발생했고 그래서 틀렸습니다. 란 결과가 나왔다.
  • 정렬해서 푸는 것이 싫다면 위의 코드와 같이 최대값과 최소값을 이용해 푸는 것도 괜찮다.

오답 코드

n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
b = [i for i in B]
b.sort()
A.sort(reverse = True)

result_a = []
result_b = []
for value in B:
    for index in range(n):
        if value == b[index]:
            result_b.append([value,index])
            b[index] = -1

for index in range(n):
    result_a.append(A[result_b[index][1]])
    
answer = 0
A = result_a
for i in range(n):
    answer += A[i]*B[i]
    
print(answer)