| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- react #리액트 #동빈나 #나동빈 #유튜브강의
- java #자바 #동빈나
- 투포인터
- java #자바
- 파이썬 #백준 #알고리즘 #코딩테스트
- css #웹 #생활코딩
- dp
- Dijkstra
- 자바 #java
- 농구
- 파이썬 #알고리즘 #코딩테스트 #프로그래머스
- java #자바 #생활코딩
- 파이썬
- BFS
- 알고리즘
- java #자바 #나동빈
- 백준
- 코딩테스트
- 프로그래머스 #파이썬 #코딩테스트 #알고리즘
- 다이나믹프로그래밍
- 백준 #알고리즘 #파이썬 #코딩테스트
- 다익스트라
- 프로그래머스
- DFS
- 백트랙킹
- PYTHON
- css #생활코딩 #웹
- 프로그래머스 #파이썬 #알고리즘 #코딩테스트
- 백준 #파이썬 #알고리즘 #코딩테스트
- 재귀
Archives
- Today
- Total
커리까지
[백준] 1026번 보물 파이썬 본문
728x90
SMALL
문제
옛날 옛적에 수학이 항상 큰 골칫거리였던 나라가 있었다. 이 나라의 국왕 김지민은 다음과 같은 문제를 내고 큰 상금을 걸었다.
길이가 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문제풀이
- 문제에서 주어진 리스트를 보면 결국에는 최솟값과 최댓값끼리 곱하라는 뜻이다.
- 여기서 a는 일반 정렬, b는 리버스로 정렬하면 된다.
- 처음에 풀 때 b는 바꾸지 말라고 해서 딕셔너리로 만들고 정렬하고 했다.
- 그러나 그냥 sorted 써서 곱하면 된다.
제출답안
import sys
input = sys.stdin.readline
def solution():
n = int(input())
a = sorted(list(map(int, input().split())))
b = {f'{value}-{idx}': [value, idx] for idx, value in enumerate(list(map(int, input().split())))}
b = dict(sorted(b.items(), key=lambda x: x[1][0], reverse=True))
b = {value[0]: [*value[1], idx] for idx, value in enumerate(b.items())}
b = dict(sorted(b.items(), key=lambda x: x[1][1]))
answer = 0
for key, value in b.items():
answer += value[0] * a[value[2]]
print(answer)
return answer
solution()
import sys
input = sys.stdin.readline
def solution():
n = int(input())
a = sorted(list(map(int, input().split())))
b = sorted(list(map(int, input().split())), reverse=True)
answer = 0
for idx, value in enumerate(a):
answer += value * b[idx]
print(answer)
return answer
solution()
- 메모리는 같지만 시간은 위에 있는 딕셔너리로 만든 코드가 0.8ms 적게 나왔다.
728x90
LIST
'알고리즘 > 풀이' 카테고리의 다른 글
| [백준] 1152번 단어의 개수 파이썬 (0) | 2022.03.01 |
|---|---|
| [프로그래머스] 2022 KAKAO BLIND RECRUITMENT 신고 결과 받기 파이썬 (0) | 2022.02.26 |
| [백준] 11728번 배열 합치기 파이썬 (0) | 2022.02.23 |
| [백준] 11000번 강의실 배정 파이썬 (0) | 2022.02.21 |
| [프로그래머스] 1차 다트게임 파이썬 (0) | 2022.02.21 |
Comments