
난이도: ★★★★☆ • solved on: 2025-07-10

자료구조
알고리즘/기법
핵심 키워드
- 문제 분해
- (a-b)만큼 반복적으로 이동해서 v에 도달할 때, 밤에 미끄러지는 것과 딱 맞는 조건을 세분화해 체크
- 불필요하게 경우의 수를 분기하므로 코드 복잡도가 증가
- 핵심 로직 흐름
- 나눗셈, 나머지, 분기(if-else)로 접근
- 예외 처리
- 나누어떨어지는 경우, v%(a-b)<=b 등 꼼꼼히 고려해야 해서 실수 위험 높음
import java.util.*;
import java.io.*;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] tokens = br.readLine().split(" ");
int a = Integer.parseInt(tokens[0]);
int b = Integer.parseInt(tokens[1]);
int v = Integer.parseInt(tokens[2]);
if (v % (a - b) == 0) {
System.out.print(v / (a - b) - (b / (a - b)));
} else if (v % (a - b) <= b) {
System.out.print(v / (a - b) - (b / (a - b)));
} else {
System.out.println(v / (a - b) + 1);
}
}
}
- 문제 분해
- 달팽이가 하루에 실제로 올라가는 높이:
a - b- 마지막 날에는 밤에 미끄러지지 않으므로,
V - A까지만 밤/낮 패턴 반복- 마지막 오르는 날(낮)은 예외이므로,
V - A까지는 (a-b)만큼 이동, 마지막에 한번 A만큼 올라서 끝남- 핵심 로직 흐름
*(V - B)미터를(A - B)씩 매일 올라감
→최소한의 일수 = ceil((V - B) / (A - B))
→ 올림(ceil) 연산이 반드시 필요 (정확히 딱 맞아도 하루 더 필요 없음)- 예외 처리
- 입력에서 항상 A > B, V > B 보장
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
int days = (v - b) / (a - b);
if ((v - b) % (a - b) != 0) days += 1;
System.out.println(days);
}
}
방법 1 & 방법 2
- 시간 복잡도: O(1)
- 공간 복잡도: O(1)
반복문 없이 수식만으로 문제를 풀려 하니 직관적인 해석이 힘들었고, if문을 어떻게 구성해야 하는지 고민이 많았음.
→ 방법1로 접근할 때 직관적이지 않다 보니 힘들었음
조건 분기마다 실제로 어떤 입력에서 해당 줄이 실행되는지 테스트하면서 흐름을 잡는 게 어려웠다.
(값 + 몫-1)/몫 패턴을 활용하거나, 나머지가 있으면 하루를 더 더하는 방식이 직관적임.ceil 함수로 통합)