[코딩테스트 C++] 병든 나이트

후이재·2020년 10월 18일
1

오늘의 문제

https://www.acmicpc.net/problem/1783

병든 나이트

접근 법

  • 입력이 2,000,000,000이니 절대 다 둘러봐서는 안된다
  • 가로, 세로안에서 최대로 많이 이동하기 위한 방법을 찾는것이 중요하다.
  • 세로가 3이상이면 더볼것도 없다 가로만큼을 가볼 수 있다.
  • 세로가 2일 경우, 2로 나눈만큼 간다.
  • 세로가 1일 경우, 갈수없다.
  • 여기서 조건이 하나 더 있는데 5번째 이상부터는 1, 2, 3, 4 이동법을 한번씩 사용해봐야한단다.
  • 모든 이동법을 하나씩 사용하면 갈수있는 최소거리인 가로7 세로3이상인것들만 따로 처리해준다.
  • 여기까지 온 애들은 4보다 더 갈수있다 이거다. 이 친구들은 세로가 3이 넘으니 가로만큼 더 갈 수 있다.

나의 풀이

#include <iostream>
using namespace std;
long long n, m;

// 병든 나이트
long long solution(){
    long long answer = 1;
    if(m < 7 || n < 3){
        if(n >= 3) answer = m;
        else if(n == 2) answer += (m-1)/2;
        if(answer >4)
            answer = 4;
    }else answer = m -2;
    
    return answer;
}

다른 풀이

#include <cstdio>

int N, M, r;

int main() {
	scanf("%d %d", &N, &M);
	if (N == 1) r = N;
	else if (N == 2) M < 7 ? r = (M + 1) / 2 : r = 4;
	else {
		if (M < 5) r = M;
		else if (M > 6) r = M - 2;
		else r = 4;
	}
	printf("%d\n", r);
}

배울 점

  • 어떻게 이렇게까지 짧게 짤 수 있는지..
profile
공부를 위한 벨로그

0개의 댓글