문제(출처: https://www.acmicpc.net/problem/2828)
< 사과 담기 게 >
문제 풀이
사과의 위치에 따라 왼쪽으로 이동할지 오른쪽으로 이동할지 바구니가 이동해야 하는 거리가 최소인 값을 찾아 이동한다.
my solution (Java)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class _2828_ { // 사과 담기 게임
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int start = 1;
int end = start + m - 1;
int j = Integer.parseInt(bf.readLine());
int result = 0;
for (int i = 0; i < j; i++) {
int k = Integer.parseInt(bf.readLine());
if (start <= k && end >= k) {
continue;
} else {
if (Math.abs(k - start) > Math.abs(k - end)) {
result += Math.abs(k - end);
start += Math.abs(k - end);
end += Math.abs(k - end);
} else if(Math.abs(k - start) < Math.abs(k - end)) {
result += Math.abs(k - start);
end -= Math.abs(k - start);
start -= Math.abs(k - start);
}else {
if(k < start) {
result += Math.abs(k - start);
end -= Math.abs(k - start);
start -= Math.abs(k - start);
}else {
result += Math.abs(k - end);
start += Math.abs(k - end);
end += Math.abs(k - end);
}
}
}
}
System.out.println(result);
}
}
Main
변수)
n : 스크린 칸
m : 바구니 수
start , end : 바구니의 왼쪽 오른쪽 인덱스
j : 사과의 개수
result : 바구니가 이동해야 하는 거리의 최솟값
k : 사과가 떨어지는 위치
- 스크린 수(n), 바구니 수(m) 입력
- 사과의 개수(j) 입력
- 사과의 수만큼 사과가 떨어지는 위치(k) 입력
: 바구니의 위치가 사과가 떨어지는 위치라면 PASS
: 오른쪽으로 이동하는 것이 최소 이동 값이라면 오른쪽으로 이동
: 왼쪽으로 이동하는 것이 최소 이동 값이라면 왼쪽으로 이동
: 오른쪽으로 이동하는 것과 왼쪽으로 이동하는 값이 같으면 바구니의 수가 하나라는 뜻이므로 왼쪽, 오른쪽으로 이동할지 판단해서 이동
- 바구니가 이동해야 하는 거리의 최솟값(result) 출력
'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글
[Baekjoon] 11497_통나무 건너뛰기 (0) | 2023.09.20 |
---|---|
[Baekjoon] 1969_DNA (0) | 2023.09.19 |
[Baekjoon] 1213_팰린드롬 만들기 (0) | 2023.09.15 |
[Baekjoon] 1449_수리공 항승 (0) | 2023.09.14 |
[Baekjoon] 1439_뒤집기 (0) | 2023.09.13 |