https://www.acmicpc.net/problem/1026
⭐ mine
조건: A는 재배열 가능, B는 재배열 금지
sortA = 오름차순 A
sortB = 내림차순 B
BB = 리스트 B 복사본 (B는 보존해야하므로)오름차순 A * 내림차순 B 하면 간단하게 풀리지만, 조건을 만족하기 위해
내림차순 B 리스트(sortB)를 생성해서 큰 순서대로 B의 각 index를 가져오자!
-> A[가장 큰 B의 원소 index] 를 sortA[i] 로 변경
그 후, 알맞게 변형된 A와 보존된 B를 곱하고 더한 S 출력
❗초기 아이디어의 문제점 (
백준에 제출하니까 틀렸습니다 나오더라...)
밑줄친 BB의 존재를 만들지 않고 바로 max_index = B.index(max) 라고 코드 작성
→ list.index(value) 함수는 동일한 value의 원소가 2개 이상일 때, 가장 처음에 나온 최소값 index만 반환해줌. == 계속 같은 index만 반환✔️ 문제 해결
중복을 없애자!
B를 복사한 BB 리스트 생성 후, max_index에 들어간 원소는 값을 -1로 변경
그럼, 중복된 값이 있었어도 max_index로 한번 거친 원소는 -1로 변하기 때문에 BB 리스트 안에서는 중복 값이 사라지게 된다. (아래 출력 사진 참조)
# mine
n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))
S = 0
sortA = sorted(A) # 1 1 3
sortB = sorted(B, reverse=True) # 내림차순으로 정렬된 B // 30 20 10
BB = B.copy()
for i in range(n):
max = sortB[i] # 30
max_index = BB.index(max) # 30이 가지는 B에서의 index = 1
BB[max_index] = -1 # 한번 거친 원소는 -1로 변경 (중복원소의 경우 index 찾을 때 최소 index밖에 안뜨는 것을 방지)
A[max_index] = sortA[i]
for i in range(n):
S += A[i] * B[i]
print(S)
# clone (역시 남들은 똑똑하다...)
n = int(input())
a_list = list(map(int, input().split()))
b_list = list(map(int, input().split()))
s = 0
for i in range(n):
s += min(a_list) * max(b_list)
a_list.pop(a_list.index(min(a_list)))
b_list.pop(b_list.index(max(b_list)))
print(s)
B의 값이 큰 순서대로 -1로 변하는 것을 확인할 수 있고,
중복된 20이 있어도 하나씩 -1로 변해 중복을 없애는 것을 확인할 수 있다.
print(BB) in for문 (4번)
print(S)
print(A)
print(B)
clone 코드 출처: https://yoonsang-it.tistory.com/44