BOJ 1026번 보물

Woogie·2021년 5월 16일
0

Velog 글 형식

[ BOJ 1026 ] 보물(Python)

문제


옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.

길이가 N인 정수 배열 A와 B가 있다. 다음과 같이 함수 S를 정의하자.

S = A[0]×B[0] + ... + A[N-1]×B[N-1]

S의 값을 가장 작게 만들기 위해 A의 수를 재배열하자. 단, B에 있는 수는 재배열하면 안 된다.

S의 최솟값을 출력하는 프로그램을 작성하시오.

출력

첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거나 같은 음이 아닌 정수이다.

입력

첫째 줄에 S의 최솟값을 출력한다.

문제 풀이

—처음에 느꼈을때는 배열 B까지 정렬을 해준다면
A는 내림차순, B는 오름차순을 통해서 제일 효율적인 코드를 만들 수 있다고 생각하였다.
하지만 B배열은 재정렬이 불가능하여 어떻게하면 제일 효율적인 코드를 만들수 있을까 생각을 하였고, 생각을하다 찾아낸것이 min함수, max함수이다 A배열에 min함수를 사용하고 B배열에는 max함수를 사용하여서 작은수와 큰수를 곱해주면 된다.
하지만 min함수와 max함수를 한번씩 사용을 해주고 나면 N번째로 작은수와 N번째로 큰수를 찾아내야하기때문에 연산을 한 배열을 삭제 시켜줘야했다. 그러므로 pop함수를 필요하게되었고, N번째로 작은수와 N번째를 큰수를 삭제시켜주기위해서 그 인덱스에 해당하는 배열의 위치를 pop을 해야했다.
결론적으로 문제를 풀때에 어려움은 없었지만 문제를 풀기전 많은 고민을 해야하는 부분이 있었다.

코드

N=int(input())
V=list(map(int,input().split()))
M=list(map(int,input().split()))
A=0
for i in range(N):
    A+=min(V)*max(M)
    V.pop(V.index(min(V)))
    M.pop(M.index(min(M)))
print(A)
rmcl..
profile
ssafy_9th / CS

0개의 댓글