https://www.acmicpc.net/problem/1026
1026번: 보물
첫째 줄에 N이 주어진다. 둘째 줄에는 A에 있는 N개의 수가 순서대로 주어지고, 셋째 줄에는 B에 있는 수가 순서대로 주어진다. N은 50보다 작거나 같은 자연수이고, A와 B의 각 원소는 100보다 작거
www.acmicpc.net
문제
옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 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의 최솟값을 출력한다.
예제 입력 1 복사
5
1 1 1 6 0
2 7 8 3 1
예제 출력 1 복사
18
예제 입력 2 복사
3
1 1 3
10 30 20
예제 출력 2 복사
80
예제 입력 3 복사
9
5 15 100 31 39 0 0 3 26
11 12 13 2 3 4 5 9 1
예제 출력 3 복사
528
힌트
예제 1의 경우 A를 {1, 1, 0, 1, 6}과 같이 재배열하면 된다.
처음에는 간단하게 풀기 위해
A의 최댓값 * B의 최소값을 곱하면 된다고 생각했다.
그래서 짠 코드
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a = sorted(a)
b = sorted(b, reverse=True)
def s(n):
result = 0
for i in range(n):
result += (a[i]) * (b[i])
print(result)
s(n)
하지만 리스트 B 는 정렬을 하면 안되므로 정답으로 표기 되어도 틀린 문제였다.
그래서 고심한 끝에
max()함수와 min()함수를 쓰기로 했다.
max, min 함수는 리스트에서는 계속 같은 최대, 최소값이 나올텐데 곰곰히 생각한 결과 출력된 결과를 삭제하기로 생각하니 해결되었다.
List에서 요소를 삭제하는 두가지 함수가 있다.
pop() 과 remove()
pop함수는 리스트 n 이 있다면
n = n.pop(인덱스 번호)
제거하고자 하는 인덱스 번호를 입력하면 그 인덱스만 제거 한 리스트가 다시 n 에 저장된다.
remove 함수는 리스트 n 이 있다면
n = remove(인덱스의 값)
제거하고자 하는 인덱스의 값을 입력하면 그 값만 제거된 리스트가 다시 n에 저장된다.
pop과 다르게 인덱스의 '값'만 입력해주면 된다.
따라서 pop 과 remove 함수를 사용한 두가지 코드로 작성이 가능하다
1. pop()
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
result = 0
a = sorted(a)
for i in range(n):
result += max(a) * min(b)
a.pop(a.index(max(a)))
b.pop(b.index(min(b)))
print(result)
2. remove()
n = int(input())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
result = 0
a = sorted(a)
for i in range(n):
result += max(a) * min(b)
a.remove((max(a)))
b.remove((min(b)))
print(result)
'개발공부 > 문제풀이' 카테고리의 다른 글
백준 10819 : 차이를 최대로 파이썬(python) (0) | 2021.12.28 |
---|---|
백준 21756 : 지우개 파이썬(python) (0) | 2021.12.27 |
백준 9093:단어 뒤집기 python(파이썬) (0) | 2021.12.13 |
백준 10610 : 30 파이썬 풀이(python) (0) | 2021.12.10 |
백준 1546 평균 python 풀이 (0) | 2021.12.02 |