본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 보물 : 1026번 - Python

728x90
반응형

https://www.acmicpc.net/problem/1026

 

1026번: 보물

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

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

 (1) [Python] 리스트 요소 꺼내기

-> pop 함수: pop은 리스트에서 맨 마지막 요소를 출력하면서 그 요소를 리스트에서 삭제하는, 즉 리스트에서 꺼내버리는 함수이다.

arr = [0, 1, 2, 3, 4, 5]
arr.pop()
print(arr)

>>> [0, 1, 2, 3, 4]

# 파이썬에서는 추가적으로 특정 위치에 있는 요소에 대해서 pop 함수를 사용할 수 있음.
arr.pop(2)
print(arr)

>>> [0, 1, 3, 4]

 

(2) 리스트에서 최대, 최소값을 제거하기

-> max,min 함수를 사용해서 최댓값과 최솟값을 찾고, remove 함수를 이용해서 제거하면 된다.

mylist = [1, 4, 0, 3, 2]

mylist.remove(max(mylist))	# 최댓값 제거
mylist.remove(min(mylist))	# 최솟값 제거

 

 

 

 

문제의 접근 방법

 

A와 B를 오름차순, 내림차순으로 정렬하여 곱하면 쉽지만 문제에서 B를 재정렬하는 것은 불가능하다고 나와있으므로 두 리스트를 합쳐서 최대, 최소값을 계산하는 방법을 생각해야 한다.

 

 

내가 막혔던 부분

 

B를 재정렬하지 않고 접근할 수 있는 방법.

=> "min,max,pop(or remove) 함수를 사용해 보기"

 

 

 

문제 풀이 방법

 

A와 B 배열의 길이 n을 입력받기 ->  A,B 배열의 원소의 개수를 n개로 지정해주기 -> map 함수를 사용해서 A와 B 리스트에 입력 값을 저장할 수 있도록 해주기 -> A의 최댓값과 B의 최솟값을 곱한 값을 저장해 줄 리스트 arr를 선언 & 그 값을 리스트에 추가 -> remove 함수를 사용해서 방금 곱해진 A의 최댓값과 B의 최솟값을 제거해주기 -> 위와 같은 방식으로 n번 반복 -> 리스트 arr 안에 있는 원소들(max(A)*min(B)의 값들)을 더해주기

 

 

 

소스코드

n = int(input())

arr = []
sum = 0

A = [0 for i in range(n)]
B = [0 for i in range(n)]
A = list(map(int, input().split()))
B = list(map(int, input().split()))

if (len(A) == n) and (len(B) == n):

    for i in range(n):
        arr.append(max(A)*min(B))
        A.remove(max(A))
        B.remove(min(B))
        
    for i in arr:
        sum += i
    print(sum)
728x90
반응형