Bibbidi Bobbidi Boo

* 알고리즘 너무 약해서 기초 문제 50개 목표로 푸는 중...

* 3시간 안에 답을 내지 못하면 답지를 보고 30분 내로 정답 판정을 받고, 3일 뒤 다시 풀어보기


Greedy

6 / 50(NEW!)

 

탐색

7/ 50

 

기초 동적 프로그래밍

6 / 50


투포인터

1 / 10

 

이분탐색

0 / 10


문제

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

 

12845번: 모두의 마블

영관이는 게임을 좋아한다. 별의별 게임을 다 하지만 그 중에서 제일 좋아하는 게임은 모두의 마블이다. 어김없이 오늘도 영관이는 학교 가는 버스에서 캐릭터 합성 이벤트를 참여했다. 이번 이

www.acmicpc.net

→ 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분

profile

Bibbidi Bobbidi Boo

@비비디

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!