728x90
🔗 문제 링크
https://www.acmicpc.net/problem/2828
📌 문제 개요
사과가 떨어지는 위치가 순서대로 주어질 때,
크기 M의 바구니를 좌우로 이동시켜 모든 사과를 받는다.
이때 바구니 이동 거리의 최솟값을 구하는 문제
📌 접근 방법
- 바구니를 [left, right] 범위로 관리
- 사과 위치가 바구니 안이면 이동하지 않음
- 바구니 밖이면 최소 거리만큼 이동
📌 핵심 아이디어
- 바구니는 항상 길이 M 유지
- 이동은 항상 최소 거리
- 상황은 3가지
- 바구니 안 → 이동 X
- 왼쪽 밖 → 왼쪽 이동
- 오른쪽 밖 → 오른쪽 이동
📌 전체 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] first = br.readLine().split(" ");
int N = Integer.parseInt(first[0]);
int M = Integer.parseInt(first[1]);
int J = Integer.parseInt(br.readLine());
int left = 1;
int right = M;
int move = 0;
for(int i = 0; i < J; i++){
int pos = Integer.parseInt(br.readLine());
if(pos >= left && pos <= right){
continue;
} else if(pos < left){
move += (left - pos);
left = pos;
right = pos + M - 1;
} else {
move += (pos - right);
right = pos;
left = pos - M + 1;
}
}
System.out.println(move);
}
}
🧾 정리
- 바구니 범위만 잘 관리하면 되는 문제
- 핵심은 조건 분기 + 최소 이동
- 구현 난이도는 낮지만 아이디어가 중요
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 백준 1236 성 지키기 JAVA 풀이 (구현, 그리디) (0) | 2026.04.06 |
|---|---|
| 백준 5800 성적 통계 JAVA 풀이 (정렬, 구현) (0) | 2026.04.06 |
| 백준 16435 스네이크버드 JAVA 풀이 (그리디, 정렬) (0) | 2026.04.03 |
| 백준 1652 누울 자리를 찾아라 JAVA 풀이 (구현, 문자열, 완전탐색, 시간복잡도) (0) | 2026.04.02 |
| 백준 4659 비밀번호 발음하기 JAVA 풀이 (구현, 문자열, O(L)) (0) | 2026.04.01 |