1. 문제
https://www.acmicpc.net/problem/1817
1817번: 짐 챙기는 숌
첫째 줄에 책의 개수 N과 박스에 넣을 수 있는 최대 무게 M이 주어진다. N은 0보다 크거나 같고 50보다 작거나 같은 정수이고, M은 1,000보다 작거나 같은 자연수이다. N이 0보다 큰 경우 둘째 줄에 책
www.acmicpc.net
책을 담을 수 있는 최소 상자의 갯수를 구하는 문제이다.
순서대로 책을 담았을 때 상자가 담을 수 있는 무게를 초과한다면 다음 상자를 꺼내야 한다.
2. 풀이
현재 상자에 담을 수 있는 무게를 current라고 하자.
담으려고 하는 책의 무게가 current 이하라면 담을 수 있을 것이고, 초과 한다면 새 상자를 준비해야 한다.
current 이하라면 담으면 되니까 cnt를 증가시키지 않고 current를 책의 무게만큼 감소시킨다.
책의 무게가 current 를 초과한다면 cnt를 1 증가시키고, current를 M으로 초기화한다.
while 문을 이용해서 책의 수(i)가 N이 될때까지 반복해주자.
아래 코드의 로직을 따르면 마지막 책을 새로운 상자에 담았을 때 cnt 를 증가시키지 않는다.
그렇기 때문에 마지막 책까지 담았는데 무게가 있다면 그 상자까지 카운트 해주는 로직을 추가해야 한다!
3. 코드
4. 느낀점
그리디 알고리즘에 익숙해질 수 있는 문제였다.
파이썬의 for 문은 객체를 까서 가져오는 개념이라 루프 안에서 아무리 i 값을 조절해도 for 루프에서 새로 할당 받는다.
즉. i 를 조절하고 싶다면 while 문을 사용해야 한다는 것!
그리고 list에 입력받은 원소를 추가하고 싶다면 books = list(map(int, input().split()))
books.append(map(int, input().split())) 이렇게 하면 안된다.
(map() 함수는 iterable의 각 요소에 대해 함수를 적용하는 객체를 반환한다. books 리스트에는 map 객체가 아니라 값을 담아야 한다. 이를 해결하기 위해 append()를 사용하는 대신에 list() 함수로 map() 객체를 리스트로 변환해야 한다.)
오늘 하루도 쌓였다.
'코딩 테스트 연습 > 백준' 카테고리의 다른 글
[Python]Baekjoon 2606번: 바이러스(BFS) (0) | 2024.02.29 |
---|---|
[Python]Baekjoon 7568번: 덩치 (0) | 2024.02.27 |
[Python]Baekjoon 5533번: 유니크 (0) | 2024.02.22 |
[C++]Baekjoon 1946번: 신입 사원 (1) | 2023.12.30 |
[C++]Baekjoon 1141번: 접두사 (1) | 2023.12.20 |