• toc {:toc}

문제 ν™•μΈν•˜κΈ°

풀이

경우의 수λ₯Ό λ‚˜λˆ„μ–΄ 문제λ₯Ό νŒŒμ•…ν•΄λ³΄λ € ν–ˆλ‹€. 칸의 μ‹œμž‘μ„ 0,0λΆ€ν„° μ‹œμž‘μœΌλ‘œ μ„€μ •ν–ˆλ‹€. λ‚˜μ΄νŠΈκ°€ 였λ₯Έμͺ½μœΌλ‘œλ§Œ 움직일 수 μžˆλ‹€λŠ” 점이 ν•΅μ‹¬μ΄λ―€λ‘œ 이에 μœ μ˜ν•΄ 쑰건을 μ„€μ •ν•œλ‹€.

  • N >= 3
    • μž…λ ₯받은 경우 λ†’μ΄λŠ” 큰 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€.
    • M >= 7 일 λ•Œ 이동 방식을 μ „λΆ€ μ‚¬μš©ν•  수 있고, 이동 방식을 μ „λΆ€ μ‚¬μš©ν•˜λ©΄ 였λ₯Έμͺ½μœΌλ‘œ 6μΉΈ μ΄λ™ν•˜κΈ° λ•Œλ¬Έμ— μ œμ™Έ(M-6)ν•œλ‹€. λ‚˜λ¨Έμ§€ 칸의 경우 2, 3번으둜 이동할 수 있기 λ•Œλ¬Έμ— 1 μΉΈμ”© 이동 κ°€λŠ₯ν•΄ μ „λΆ€ 더해주면 λœλ‹€.
    • M ⇐ 6 인 κ²½μš°μ—λŠ” 이동 방식을 μ „λΆ€ μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμ— μ΅œλŒ€ 4번 움직일 수 있고, 칸이 μ¦κ°€ν• μˆ˜λ‘ 1μΉΈμ”© 더 μ¦κ°€μ‹œν‚¬ 수 μžˆμœΌλ―€λ‘œ μ μš©μ‹œμΌœμ€€λ‹€.
  • N == 2
    • 1, 4번의 이동 방식은 μ‚¬μš©ν•  수 μ—†λ‹€. λ•Œλ¬Έμ— 였λ₯Έμͺ½μœΌλ‘œ 두 μΉΈμ”© 이동해야 ν•œλ‹€.
  • N == 1
    • 이동할 수 μ—†λ‹€.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
LL N, M;
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
 
    LL res = 1;
 
    cin >> N >> M;
    N--; M--;
 
    if(N >= 2){
        if(3<=M && M<6) res += 3;
        else if(M==2) res += 2;
        else if(M==1) res += 1;
        else if(M==6) res += 4;
        else if(M==0) res += 0;
        else {
            res += 4;
            res += M-6;
        }
    }
    else if(N == 1){
        if(M >= 6) res += 3;
        else if(M == 5 || M == 4) res += 2;
        else if(M == 2 || M == 3) res += 1;
        else if(M == 0) res += 0;
    }
    else if(N == 0 || M == 0) res += 0;
    else{
        res += 4;
        res += M-6;
    }
 
    cout << res << '\n';
 
    return 0;
}

사싀 ν’€ λ•ŒλŠ” μœ„μ²˜λŸΌ 풀이λ₯Ό ν•˜λ‹ˆ μƒλ‹Ήνžˆ λ³΅μž‘ν•˜κ²Œ μ–½νžŒ 것 κ°™μ•˜λŠ”λ° 싀상 압좕해보면 λ‹€μŒκ³Ό κ°™λ‹€.

  • N == 1
    • 이동할 수 μ—†λ‹€.
  • N == 2
    • 2, 3번만 μ‚¬μš©ν•  수 있기 λ•Œλ¬Έμ— 였λ₯Έμͺ½μœΌλ‘œ 두 μΉΈμ”©λ§Œ 이동할 수 μžˆλ‹€.
    • μ΅œλŒ€ 4번 움직일 수 μžˆλ‹€.
    • M ⇐ 6 인 경우 4λ²ˆλ³΄λ‹€ 적게 움직인닀.
    • 두 μΉΈμ”© 움직일 수 있기 λ•Œλ¬Έμ— (M+1)/2둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
    • min(4, (M+1)/2)
  • N은 ν¬μ§€λ§Œ M ⇐ 6 인 경우
    • 이동 방식 μ „λΆ€λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
    • μ΅œλŒ€ 4번 움직일 수 μžˆλ‹€.
    • μœ„λ‘œ 두 μΉΈ 이상 움직일 수 있기 λ•Œλ¬Έμ— 였λ₯Έμͺ½μœΌλ‘œ μ΅œλŒ€λ‘œ μ΄λ™ν•˜λ €λ©΄ 1 μΉΈμ”© 움직여야 μ΅œλŒ€μ΄λ‹€.
    • min(4, M) 으둜 ν‘œν˜„ν•  수 μžˆλ‹€.
  • μœ„ 쑰건에 ν•΄λ‹Ήν•˜μ§€ μ•ŠλŠ” 경우
    • 전체 이동 방식을 μ „λΆ€ μ‚¬μš©ν•˜κ³  λ‚˜λ¨Έμ§€λŠ” 였λ₯Έμͺ½μœΌλ‘œ ν•œ μΉΈμ”© 이동해 μ΅œλŒ€λ‘œ 이동 횟수λ₯Ό μ±„μš΄λ‹€.
    • m-2둜 ν‘œν˜„ν•  수 μžˆλ‹€.
#include <bits/stdc++.h>
using namespace std;
int main () { 
	ios_base::sync_with_stdio(false); 
	cin.tie(nullptr);  
	int N, M; 
	cin >> n >> m; 
	
	if (n == 1) cout << 1; 
	else if (n == 2) cout << min(4, (m + 1) / 2); 
	else if (m < 7) cout << min(4, m); 
	else cout << m - 2; 
 
	return 0;
}