Greedy Python 백준 BOJ2217 로프 코딩테스트 (10)

2024. 7. 12. 18:00·IT, Computer

썸네일

서론

지난번엔 그리디 알고리즘에 대해 알아보았고 몇 문제들을 풀어보았다. 해당 포스팅이 궁금하면 여기로 가길 바란다. 이번에는 이어서 문제를 풀고자 한다. 백준에 나와있는 BOJ2217 로프에 대한 문제인데, 이 문제에 대한 링크는 여기로 가면 된다.

 


문제 조건

문제의 조건을 적어보겠다. 1. 로프의 길이와 굵기는 다르다. 2. 때문에 들어올릴 수 있는게 다르다. 3. 여러개의 로프는 연결 할 수 있고, 연결한 만큼 더 많은 중량을 들어올리기가 가능하다. 4.K개 로프를 사용해 W 중량 물체를 올릴 때,  각각에거 W/K만큼 중량이 걸린다. 아무튼 이 조건을 활용해서 들 수 있는 최대 중량을 구하는 것이다. 모두 사용안 해도 된다가 포인트 같다.


내 풀이

예시를 보면 2개가 있을때 10, 15를 각각 들 수 있으면 20개가 최대다. N/K가 최소값보다 크면 되는거 아닌가? 그리고 마지막을 총 들 수 있는 건 N*K로 하면 되지 않을까 싶지만 문제의 조건인 모두 안 사용하고 임의로 골라서 사용해도 된다가 걸린다.  3개가 있고 5, 10, 15가 있으면 어떨까. 내 생각대로 하면 5가 최소값이라 3*5 = 15가 되어야 하지만 사실 10, 20을 선택하면 20으로 이게 이득이다. 얠 어찌해야될까. 정렬 후 큰거부터 차례대로 저걸 해본다음에 평균 길이가 적어지는 순간에 STOP하고 이전껄로 한다면? 오호라 근데 이게 그리디인가? 머 아무튼 이걸로 짜보겠다.

 

# 1. 정렬 후
# 2. 큰거부터 차례대로 하나씩 stack에 추가하면서
       tmp와 result를 비교한다. tmp는 새로 만들어진 result로 마지막에 추가된애(이미 정렬되서 가장 작은 값임)*길이임.
# 3. 계속하다가 이전 tmp가 result 이전보다 더 작아지는 순간이 오면
# 4. 그때 stop하고 pop해서 이상적 stack만들고
# 5. 다시 result를 구하면 될듯 

s = [5,10,15]
l = len(s)
s = sorted(s) # 1. 정렬 후

tmp, result = 0, 0
new_s = []
for i in range(l):
    x = s.pop()
    new_s.append(x)
    tmp = new_s[-1]*len(new_s)
    if tmp >= result: 
        result = tmp
    else:
        new_s.pop()
        print(new_s[-1]*len(new_s))

   else:
    break
print(x*len(new_s))
 

후. 난 정말 이게 한계다. 처음에는 n/k를 비교했는데 도저히 안돼서 그냥 전체를 계산하면서 했다. 


정석풀이

해당 풀이는 이 강의에 나온다. 일단 사용할 로프의 개수를 정해두기로 가정하면 가장 긴놈을 선택하는 것이 맞다고 판단한다. 고로 최대 중량대로 정렬한 후, w[n-k]*k를 하면 끝이다. 나는 정말 고전했는데 이 강의에서는 딱히 할말이 없다면서 넘어간다. 눈물남.

해답 코드

아 이사람은 그냥 max로 했구나. 그니까 sort를 하고, answer와 w[n-i]*i와 비교했다. 나처럼 pop()할 필요가 없었다는 뜻. 하하. 배열이 정해졌으니, 앞에 값과 비교하며 max값을 다 돌린거다 기껏해야 한바퀴니 그냥 다 돌린듯 하다. 이걸 파이썬 형식으로 바꾸면 다음과 같다.

s = [5,10,15]
l = len(s)
s = sorted(s) 
result = 0

for i in range(1, l + 1):
    result = max(result, s[l - i] * i)
print(result)

 너무 깔끔했군. 난 그동안 무엇과 고전했는가. 처음에 접근 방식은 바로 떠올랐다는 점에서 위안을 삼아야겟다. 아무튼 오늘은 여기까지 하고,  다음 포스팅에서는 DP 문제에 대해 다룰 예정이다. 내 코딩 테스트 준비 과정에 대해 궁금하신 분은 여기로.

 

 

 

 

 

 

 

'IT, Computer' 카테고리의 다른 글

티스토리 블로그 애드센스 수익 여정 포스팅 (5) 사이트 검토 요청 가능 횟수가 모두 사용  (0) 2024.07.15
다이나믹 프로그래밍 DP 알고리즘 파이썬 코딩테스트 (11)  (0) 2024.07.13
DFS 알고리즘 개념 파이썬 코딩테스트 (9)  (0) 2024.07.11
티스토리 블로그 애드센스 수익 여정 포스팅 (4) ads.txt 문제를 해결 해보자 2  (0) 2024.07.10
그리디 알고리즘 Greedy 파이썬 회의실 배정 BOJ1931 코딩테스트(8)  (0) 2024.07.03
'IT, Computer' 카테고리의 다른 글
  • 티스토리 블로그 애드센스 수익 여정 포스팅 (5) 사이트 검토 요청 가능 횟수가 모두 사용
  • 다이나믹 프로그래밍 DP 알고리즘 파이썬 코딩테스트 (11)
  • DFS 알고리즘 개념 파이썬 코딩테스트 (9)
  • 티스토리 블로그 애드센스 수익 여정 포스팅 (4) ads.txt 문제를 해결 해보자 2
QUISEOL
QUISEOL
제품 사용기, 프로그래밍 언어 공부 블로그 입니다.
  • QUISEOL
    QUISEOL
    QUISEOL
    • 분류 전체보기 (103)
      • IT, Computer (54)
      • 그 외 경험기 (49)
  • 블로그 메뉴

    • 링크

      • insta
    • 공지사항

    • 인기 글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    QUISEOL
    Greedy Python 백준 BOJ2217 로프 코딩테스트 (10)
    상단으로

    티스토리툴바