[BOJ] 1026

Posted by RoadtoS7 on January 09, 2020 · 1 min read

문제

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

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

S = A[0]B[0] + … + A[N-1]B[N-1]

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

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

풀이 과정

S의 값이 최솟값이 되기 위해서는 (작은 수) * (큰 수) 의 곲으로 이루어져야 한다. 따라서 A는 오름차 순으로 정렬하고 B는 내림차 순으로 정렬하여 각각 인덱스 숫자가 같은 것끼리 곲하여 합하면 S의 최솟값이 나온다. B에 있는 수는 재배열하면 안된 다고 했지만, 사실 A만 정렬하여 B와 맵핑되도록 하더라도 사실 B의 입장에서는 맵핑된 숫자가 바뀌는 것이 B가 정렬되었다고도 생각될 수 있기 때문에 B를 정렬한 것과 정렬하지 않은 것을 구분할 수 없는 상황이다. 따라서 A와 B를 정렬하여도 괜찮다.

코드

count = int(input())

a = list(map(int,input().split()))
b = list(map(int, input().split()))

a.sort()
b.sort()

result = 0
for i in range(count):
    result += a[i]*b[i]

print(result)

새롭게 알게 된 점

  • 한 줄에 여러개의 입력을 받을 때에는 input().split(구분자)를 사용한다.
  • 위의 반환형은 list이다.
  • 만약 한 줄에 여러개 입력받은 것을 int형으로 받으려면 map()을 사용한다. map(int, input().split())
  • 처음에는 리스트 두개를 곱하면 각각의 리스트 구성요소를 인덱스가 같은 것끼리 곲한 값을 구성요소로 가지는 리스트를 반환해주는 줄 알았는데, 그게 아니었다. 두 리스트의 구성요소를 인덱스가 같은 것끼리 곲한 것을 얻고 싶으면 for문을 돌려야한다.(map을 이용해서 할 수 있는지 더 찾아봐야한다.)