* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...
* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기
Greedy
6 / 50(NEW!)
탐색
7/ 50
기초 동적 프로그래밍
6 / 50
투포인터
1 / 10
이분탐색
0 / 10
문제
https://www.acmicpc.net/problem/12845
→ solved.ac 기준 실버 3
문제 해결 아이디어
최대한 골드를 많이 받을 수 있게 하는 방법?
→ 가장 레벨이 커질 수 있는 카드끼리 먼저 합치고 나중에 다른 레벨끼리 합치는 게 좋다.
문제의 예시처럼 c1(40), c2(30), c3(30)이 있다고 가정했을 때
40 레벨 먼저 합치고 나서 다른 레벨을 합쳐주어야
두 번 합칠 때 40레벨 + a 로 합쳐져서 높아진다.
→ 그럼 어떻게 먼저 가장 높은 레벨 끼리 합치도록 구현하는가?
→ 실제로 써보니 약간의 공통점이 있다.
직접 많은 예시로, a1(30), a2(70), a3(60), a4(40) 있다고 가정할 때(괄호 안이 레벨)
가장 레벨이 커질 수 있는 카드끼리 합친다면
70 + 60 = 130
30 + 70 = 10
70 + 40 = 110
이고 130 + 10 + 110 이 답안이 될 것.
여기서 보이는 공통점은 결국 합칠 때 받는 골드는 70 + a
⇒ for문 (레벨 + 최대 레벨)이 결국 최대한 골드를 많이 받는 방법.
구현
내 풀이
n = int(input())
array = list(map(int, input().split()))
# 가장 높은 레벨을 가진 카드의 레벨
max_number = max(array)
answer = 0
# 가장 높은 레벨이 2개 이상일 때를 위한 방지
temp = True
for a in array:
# 가장 높은 레벨인데 처음이면
if max_number == a and temp:
temp = False
else:
# 가장 높은 레벨 + 현재 레벨
answer += max_number + a
print(answer)
메모
- 걸린 시간: 23분
'Algorithm' 카테고리의 다른 글
[알고리즘] Programmers Level 1 - 체육복(python3) (0) | 2023.06.02 |
---|---|
[알고리즘] BOJ 14502번 - 연구소(python3) (0) | 2023.06.02 |
[알고리즘] BOJ 10819번 - 차이를 최대로(python3) (0) | 2023.05.27 |
[알고리즘] BOJ 3273번 - 두 수의 합(python3) (0) | 2023.05.27 |
[알고리즘] BOJ 11722번 - 가장 긴 감소하는 부분 수열(python3) (0) | 2023.05.27 |