프론트엔드 개발자의 기록 공간

[백준 node.js] 1783번_병든 나이트 본문

알고리즘_JS/백준_Greedy

[백준 node.js] 1783번_병든 나이트

[리우] 2020. 12. 29. 04:00

백준 그리디 알고리즘 2437번_저울

난이도 : 실버V

 

문제 설명

입출력

 

문제 풀이 : 이 문제의 핵심은 병든 나이트의 이동방법이 항상 오른쪽 방향으로 움직인다는 것입니다.

여기서 최대 방문할 수 있는 최대 개수를 구해야합니다.

이동 횟수가 5가지 미만이면 1~4중에 마음대로 사용하면 됩니다.

이동 횟수가 5가지 이상이면 1~4를 모두 최소 1번씩은 사용해야합니다. (여기서 핵심을 적용시켜야한다.)

그럼 횟수가 5가지 이상에서는 1~4를 모두 써야하는데 나이트는 항상 오른쪽 방향으로 움직이니깐 오른쪽의 움직임을 최소화 하기 위해 2칸씩 움직이는 2,3번은 한번만 이동하고 나머지를 1,4번으로 반복해주면됩니다.

즉, 4가지 경우로 분류 1. 세로길이가 1일때 2. 세로길이가 2일때 3. 세로길이 3이상 가로길이 6이하일때 4.나머지

//실버 5 병든 나이트
function solution(n, m) {
  // 모든 이동은 시작지점 포함이다.
  //세로 길이가 1인 경우 이동이 불가능하므로 1출력
  if (n === 1) {
    console.log(1);
  }
  //세로 길이가 2일때 위 아래로 한칸씩 밖에 못 움직이므로 2, 3번의 경우만 가능
  else if (n === 2) {
    //두 칸 오른쪽으로 갈때마다 한번씩 이동하므로 m에 +1을 해준뒤 2로 나눔
    //이동 횟수가 4이상이면 1~4번 최소 한번이상은 옮겨야하는데 1,4번이 안되니깐
    //4와 두 칸씩 옮긴 횟수와 비교해서 작은값 대입
    console.log(Math.min(4, parseInt((m + 1) / 2)));
  }
  // 세로가 3이상인 경우
  else {
    // 세로가 3이상이지만 가로가 6보다 작다면 최대로 움직일려면 1,4번의 경우만 이용 가능
    if (m <= 6) {
      //이동 횟수가 4이상이면 1~4번 최소 한번이상은 옮겨야하는데 2,3번이 안되니깐
      //4와 두 칸씩 옮긴 횟수와 비교해서 작은값 대입
      console.log(Math.min(4, m));
    } 
    // 세로길이 3이상, 가로길이 6이상일때 1~4모든 경우 가능
    else {
      //최대로 이동할려면 2,3은 각각 한번씩 이후 1,4번만 반복해주면된다.
      //2,3을 한번씩 하고 나면 오른쪽으로 두칸씩 이동한것이 되므로 m에서 -2를 해주면된다.
      console.log(m - 2);
    }
  }
}

const readline = require("readline");
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

let input = [];
rl.on("line", function (line) {
  input = line.split(" ").map((el) => parseInt(el));
}).on("close", function () {
  let n = input[0];
  let m = input[1];
  solution(n, m);

  process.exit();
});

 

*처음에 이중배열을 만들어주고 체스 시작위치를 제일 왼쪽 아래에 설정해준후 N과 M의 범위를 벗어나지 않을때까지 반복문을 통해 카운트를 해주면 될 줄 알았다. 하지만 풀다가 예외적인 상황이 너무 많이 발생하여 도저히 이 방법이 아닌 것같아 다른 풀이를 참고해보았다. 역시나 되돌아가고있었다.... 아직 가야할 길이 멀다는 것을 느꼈다 ㅠㅠ

728x90
Comments