[백준] 2437번 저울 - 파이썬(Python)

2022. 1. 20. 13:50· 알고리즘/문제풀이
목차
  1. 나의 풀이
  2. 코드 설명 및 풀이법
728x90

문제 (링크)

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

 

2437번: 저울

하나의 양팔 저울을 이용하여 물건의 무게를 측정하려고 한다. 이 저울의 양 팔의 끝에는 물건이나 추를 올려놓는 접시가 달려 있고, 양팔의 길이는 같다. 또한, 저울의 한쪽에는 저울추들만 놓

www.acmicpc.net

 

나의 풀이

import sys
input = sys.stdin.readline

n = int(input())
arr = list(map(int, input().split()))
arr.sort()

target = 1

for num in arr:
    if target < num:
        break

    target += num

print(target)

 

코드 설명 및 풀이법

처음엔 1원부터 모든 무게의 합까지 확인하면서 연속된 합이 끊어지는 부분을 구해야겠다고 생각했다.

 

이를 위해서 무언가 누적합이나 DP를 이용해야할 것 같은데 도저히 방법이 떠오르지 않았다.

 

결국 풀이를 봤는데, 바로 이해가 되질 않아서 여러 해설을 찾아다녔고, 정말 명쾌한 풀이를 발견했다.

 

https://aerocode.net/392

 

백준 2437 풀이 및 해설

개요 매우 복잡해보이는 문제가 그림으로 풀면 매우 단순하게 풀리는 경우 는 그리 드문일이 아닙니다. 이 문제는 수학적 귀납법으로도 풀 수 있지만, 수직선을 사용하면 훨씬 직관적이고 쉽게

aerocode.net

 

풀이의 핵심은 다음과 같다.

 

편의상 미지수를 사용하겠지만 결코 어렵지 않으니 잘 따라가보자.

 

총 N개의 저울추 중에서 몇 가지를 뽑아서 지금까지 K만큼의 무게를 측정할 수 있다고 가정할 때,

 

무게가 X인 새로운 저울추가 추가된다고 하면, 새로 측정할 수 있는 무게는 (1 ~ K) * X가 된다.

 

 

예를 들어보자.

 

만약 [1, 1, 2]의 무게추가 있고 이 세 가지의 무게추를 이용해 측정할 수 있는 무게는 1, 2, 3, 4이다.

 

즉, K = 4인 것이다.

 

여기서 무게가 3인 새로운 저울추가 추가된다고 가정해보자.

 

무게가 3인 저울추가 추가된다면, 새로 측정할 수 있는 무게는 기존에 측정할 수 있던 무게 (1 ~ K) + 새로운 무게추가 되므로

 

1 + 3 = 4

2 + 3 = 5

3 + 3 = 6

4 + 3 = 7

 

으로 각각 4, 5, 6, 7이 된다.

 

여기서 4는 이미 [1, 1, 2]의 무게추만으로 만들 수 있기 때문에 제외하면,

 

무게가 3인 새로운 저울추가 새로 추가되면 이제 1 ~ 7까지의 무게를 측정할 수 있게 되는 것이다.

 

그리고 이 단계를 거칠 때마다 K는 현재까지의 모든 무게추의 합이된다.

 

 

그렇다면 새로운 무게가 추가될 때 1 ~ K중 측정할 수 없는 무게는 어떻게 판단할까?

 

이번엔 기존 [1, 1, 2]에 무게가 5인 무게추를 추가한다고 가정해보자.

 

기존 무게추로 측정할 수 있는 무게 역시 1, 2, 3, 4이다.

 

이제 무게가 5인 무게추를 새로 추가해보자.

 

동일한 로직으로, 무게가 5인 무게추가 추가된다면 새로 측정할 수 있는 무게는

 

1 + 5 = 6

2 + 5 = 7

3 + 5 = 8

4 + 5 = 9

 

으로 각각 6, 7, 8, 9가 된다.

 

이로써 무게가 5인 무게추가 새로 추가되면 [1, 1, 2, 5]의 무게추로 측정할 수 있는 무게는

 

1, 2, 3, 4, 6, 7, 8, 9가 되고 이 중 측정할 수 없는 무게의 최소값은 5가 된다.

 

 

이를 일반화하는 규칙은 다음과 같다.

 

앞서 언급했듯, 총 N개의 무게추 중 몇 가지를 뽑아 1 ~ K만큼의 무게를 측정할 수 있다고 가정할 때,

 

K는 현재까지 사용한 모든 무게추의 합과 같다. (모든 무게추를 사용했을 때 측정할 수 있는 값이므로)

 

그리고 무게가 X인 새로운 무게추를 추가한다고 했을 때, 측정할 수 없는 무게가 생기는 경우는

 

기존 측정할 수 있던 1 ~ K와, 새로 측정할 수 있는 무게인 (1 ~ K) * X 사이에 빈 공간이 생길 때가 된다.

 

이 공간이 발생하는지에 대한 여부는 새로운 무게추 X와 기존 측정할 수 있는 무게의 최대값인 K를 비교해 구할 수 있다.

 

지금까지 1 ~ K까지의 무게를 측정할 수 있었으므로, 다음에 측정해야 할 무게는 K+1이 될 것이다.

 

하지만 만약 새로운 무게추의 무게 X가 이 K + 1보다 크게 되면 결국 K + 1은 측정할 수 없는 수가 된다.

 

이 원리를 이용하여 코드를 짜면 정답을 받을 수 있다.

저작자표시 (새창열림)

'알고리즘 > 문제풀이' 카테고리의 다른 글

[백준] 1774번 우주신과의 교감 - 파이썬(Python)  (0) 2022.02.16
[백준] 1043번 거짓말 - 파이썬(Python)  (1) 2022.02.15
[백준] 2493번 탑 - 파이썬(Python)  (0) 2021.11.23
[백준] 19237번 어른 상어 - 파이썬(Python)  (0) 2021.11.15
[백준] 1766번 문제집 - 파이썬(Python)  (0) 2021.11.11
  1. 나의 풀이
  2. 코드 설명 및 풀이법
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준] 1774번 우주신과의 교감 - 파이썬(Python)
  • [백준] 1043번 거짓말 - 파이썬(Python)
  • [백준] 2493번 탑 - 파이썬(Python)
  • [백준] 19237번 어른 상어 - 파이썬(Python)
SeongOnion
SeongOnion
서버는 꺼지지 않아요
조무래기 코딩서버는 꺼지지 않아요
SeongOnion
조무래기 코딩
SeongOnion
전체
오늘
어제
  • 분류 전체보기 (166)
    • 알고리즘 (81)
      • 이론 (8)
      • 문제풀이 (73)
    • 언어 (15)
      • Python (9)
      • JavaScript (1)
      • JAVA (5)
    • 데이터베이스 (5)
    • 프레임워크 (15)
      • Django (7)
      • Spring (8)
    • 그 외 공부 (37)
      • 운영체제 (1)
      • 자료구조 (14)
      • 네트워크 (5)
      • CS (2)
      • 기타 (6)
      • 트러블 슈팅 (9)
    • 프로젝트 (0)
    • 개발자취 (8)
    • 회고 (3)
    • 주저리주저리 (1)
    • 기타 (비개발) (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스택
  • 코딩
  • 장고
  • 프로그래머스
  • 이진탐색
  • 개발자
  • 트러블 슈팅
  • 투 포인터 알고리즘
  • 오픈소스
  • 파이썬
  • 소수
  • DRF
  • 백준
  • 코딩테스트
  • 웹
  • 큐
  • 컨트리뷰트
  • 알고리즘
  • Django
  • BFS
  • 에라토스테네스의 체
  • 자바
  • 정렬 알고리즘
  • BFS/DFS
  • DP
  • 그리디알고리즘
  • 데이터베이스
  • 브루트포스
  • spring
  • 회고

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
SeongOnion
[백준] 2437번 저울 - 파이썬(Python)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.