카테고리 없음
백준 1783
geminanolja
2025. 4. 12. 21:38
https://www.acmicpc.net/problem/1783
🧠 문제 핵심 재정리
- 병든 나이트는 총 4가지 이동 방법이 있다:
- 단, 이동 횟수가 4회 이상이면, 4가지 이동방법을 적어도 한 번씩 써야 한다!
- 이 제약은 이동 횟수가 4회 미만일 경우엔 적용되지 않는다!
- 목표는 방문할 수 있는 칸 수의 최대값.
✅ 정답 풀이 전략 (정확한 조건 반영)
이동 방법을 보면 공통적으로 오른쪽으로만 이동한다는 점에서 아래처럼 경우를 나눌 수 있어:
1. N == 1
- 위/아래로 2칸 이동 불가능 → 이동 불가
- 방문 칸 수: 1
2. N == 2
- 이동 방법 2, 3번만 가능 (한 칸 위/아래 + 오른쪽 2칸)
- 오른쪽으로 두 칸씩 전진 가능 횟수: (M - 1) / 2 (이동 횟수)
- 방문 칸 수: min(4, (M + 1) / 2)
3. N >= 3
- 모든 이동 가능
➤ M < 7
- 4가지 이동법을 전부 사용 불가능 → 최대 이동 4회 미만 → 제약 없음
→ 방문 칸 수: min(4, M)
➤ M >= 7
- 4가지 이동법 다 쓸 수 있고, 그 이후엔 가장 효율적인 방법만 반복 가능
→ 방문 칸 수: M - 2
📌 예제 검증
입력 출력 설명
100 50 | 48 | M >= 7, N >= 3 → M - 2 |
1 1 | 1 | 이동 불가 |
2 4 | 2 | 2번, 3번만 가능, 최대 2칸 이동 |
💬 정리 요약
- 핵심은 "이동횟수가 4회 이상이면 4가지 방법 모두 한 번 이상 써야 한다"
- 그래서 M이 7 이상일 때만 4가지 방법 모두 가능하므로 M - 2개 칸 방문 가능!
#include <iostream>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
int result = 0;
if (N == 1)
{
result = 1;
}
else if (N == 2)
{
result = min(4, (M + 1) / 2);
}
else
{
if (M < 7)
{
result = min(4, M);
}
else
{
result = M - 2;
}
}
cout << result << endl;
}