백준 :: 보물 <1026번>

혜 콩·2022년 5월 23일
0

알고리즘

목록 보기
17/61

> 문제 <

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

profile
배우고 싶은게 많은 개발자📚

0개의 댓글