백준 - 1783번 병든 나이트

weenybeenymini·2020년 12월 12일
0

문제

4가지 방법으로 이동할 수 있는 나이트가 있는데
이동 횟수가 4번 이상일 땐 이동 방법을 모두 한 번씩 사용해야한다
방문할 수 있는 칸의 최대 개수는~!?

생각

문제 이해하는 것이 좀 힘들었는데
맨 처음 시작하는 곳도 방문한 것으로 보고,
이동하면서 거치는 곳은 방문한 칸이 아니고,
이동 끝나고 도착한 곳을 방문한 칸으로 본다! 체스 같은 느낌!

가능한 경우를 나눠서 방문한 칸의 최대 개수를 구하면된다

  1. 높이가 1일땐 움직일 수 없으니 시작한 칸만 방문 가능
    (result = 1)

  2. 높이가 2일땐 2가지 경우(1칸 위, 2칸 오른쪽, 1칸 아래 2칸 오른쪽)밖에 못 움직이는데,
    4번 이상 이동 할 땐 모든 경우를 써야하니까, 최대 4칸 밖에 못 방문한다
    (result < 4 ? result : 4)

  3. 높이가 3이상이면 모든 방법의 제약이 없긴 한데,
    (case1) 4번보다 적게 이동해서, 최대한 오른쪽으로 적게 가는 방법
    (case2) 4번 이상 이동해서, 모든 이동 방법 다 사용 후! 한 칸씩만 오른쪽으로 이동하는 방법
    중 최대 방문할수잇는 칸 개수가 큰 방법을 선택!

코드

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

int n, result;
vector<pair<int, int>> meeting;

int main() {
	int n, m, result; //세로 길이 가로 길이

	cin >> n >> m;

	if (n == 1) {
		result = 1;
	}
	else if (n == 2) {
		result = (1 + (m-1) / 2);
		result = result < 4 ? result : 4;
	}
	else {
		int case1 = m < 4 ? m : 4;
		int case2 = (m - 5) + 3;

		result = max(case1, case2);
	}

	cout << result;

	return 0;
}

0개의 댓글

관련 채용 정보