백준_1783_병든 나이트

준비해용·2023년 4월 30일

백준

목록 보기
4/16

🗨️Comment

  • input N, M의 최댓값이 컸기 때문에, 단순히 반복이나 완탐적인 접근은 안된다고 생각함
  • 5칸 미만을 갈 수 있냐 없느냐의 1차적 기준은 N의 크기라고 생각
  • N을 1부터 늘려보면서 케이스를 나눠보는 시도를 함 4가지 경우를 모두 가려면, M의 크기가 보장되어야!
  • N에 따라 경우를 나누고
    M // 2 의 연산결과를 활용하여 4와 비교 후,
    최솟값 도출하는 방향까지는 생각했다
  • 경우를 나누면서 일반화를 잘 시켜야 했다

⚠️ Error

  • 4가지 방법을 최소 한 번씩만 쓰고나면, 그 후에는 최댓값을 목표로 이동하면 된다 → 한 번씩 보장된 후에는, 오른쪽으로 한 칸/위로 2칸만 이동하면 된다 ( ← 이 생각까지 못했다 ) ⇒ M-2 ( 2는 최소 한번씩의 사용을 위해 오른쪽으로 2칸씩 이동한 2번의 경우때문에 - )
  • N ==2 인 경우 계산 실수가 있었음

📝 풀면서 메모

# 2초 / 128MB

# N X M 체스판 / 나이트는 좌측하단에 위치 
# 4방향 이동 : 항상 오른쪽으로!

# Purpose : 여행하면서 방문한 칸의 수를 최대로 

# Condition
    # 이동횟수 >= 4 
        # 이동방법을 모두 한번씩 사용해야함
    # 이동횟수 < 4 ( 방문한 칸이 5개 미만)
        # 이동방법 제약 x (= 같은 방향 여러번 ok)

# Solution 
# 이동횟수가 4번보다 적으려면
    # if : N == 2: 움직일 수 있는 거 : 2, 3뿐
    # 아무리 M크기가 길어도, 4번이상 움직이면 안됨 -> 맥시멈 output이 4
    # 움직일 수 있는 값이랑, 4비교해서 출력

    # if : N == 3 : 
        # if : M < 7 : 4가지 경우 못함 
        # if M <= 7:
            # 최대가 4 
            # print(min(M-1, 4))
        # else: 
            # print(M-3)
    # if : N == 4부터 
        # if M <= 7:
            # print(min(min(M-1) ,4 ))
        # else:
            #

구글링해서 제출한 답 코드

# Input
# 1 <= N, M <= 2억 / 최댓값이 매우 큼 
N, M = map(int, input().split())

if N == 1: 
    print(1)
elif N == 2:
    print(min(( M - 1)//2 + 1, 4))
elif M <= 6:
    print(min(4, M))
else:
    print(M-2)

0개의 댓글