평범한 필기장

[BOJ_Python] 11508_2+1 세일 본문

코딩 테스트 준비/BOJ

[BOJ_Python] 11508_2+1 세일

junseok-rh 2023. 3. 19. 19:03

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

 

11508번: 2+1 세일

KSG 편의점에서는 과일우유, 드링킹요구르트 등의 유제품을 '2+1 세일'하는 행사를 하고 있습니다. KSG 편의점에서 유제품 3개를 한 번에 산다면 그중에서 가장 싼 것은 무료로 지불하고 나머지 두

www.acmicpc.net

내가 생각한 풀이 방식

  • 일단 최소 비용을 구하기 위해선 2+1에서 무료가 되는 물품의 비용이 최대가 되어야한다.
  • 그래서 가격 리스트를 내림차순으로 하고 앞에서 3개씩 한 묶음으로하면 무료가 되는 물품들의 가격이 최대가 된다고 생각했다.
  • 그래서 2번째, 5번째  ~ 순의 인덱스에 잇는 물품들의 가격을 제외하고 모든 가격들을 합하는 방식으로 구했다.

내 오답 코드

n = int(input())
lst = []
for _ in range(n):
    lst.append(int(input()))

lst.sort(reverse = True)
ind_lst = []
k = 2
while k < n:
    ind_lst.append(k)
    k += 3

cnt = 0
for i in range(len(lst)):
    if i not in ind_lst:
        cnt += lst[i]

print(cnt)

이 오답코드에서는  for문 한번만 돌려서 풀 수 있는 것을 너무 복잡하게 생각해서 시간초과가 났다. 뺄 인덱스인 2,5,8, ...를 ind_lst란 리스트에 따로 저장해서 가격 리스트인 lst에서 ind_lst에 있는 인덱스에 있는 인덱스에 해당하는 값은 안더하는 식의 번거로운 방식을 택했었다. (너무 복잡하게 돌아가는 생각을 해버렸다 ㅎㅎ;;) 

 

내 정답 코드

n = int(input())
lst = []
for _ in range(n):
    lst.append(int(input()))

lst.sort(reverse = True)

cnt = 0
for i in range(n):
    if i % 3 != 2:
        cnt += lst[i]
print(cnt)

도움이 되셨으면 좋겠습니다!! 아직 코딩 실력이 많이 부족해서 복잡하게 생각하는 경향이 많이 있는듯 하네요. 귀엽게 봐주시면 감사하겠습니당 ㅎㅎ