Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 모던 자바스크립트 Deep Dive
- Vue3 Router
- Frontend Roadmap
- frontend roadmap study
- 우테캠 회고록
- 모던 자바스크립트 Deep Dive TIL
- K_Digital Training
- 백준 node.js
- 프로그래머스 K_Digital Training 프론트엔드
- Vue3
- useRef 지역 변수
- TypeScript 문법 소개
- 개발자 특강
- 머쓱이
- react 프로젝트 리팩토링
- KDT 프로그래머스 데브코스 프론트엔드
- KDT 프로그래머스
- 프로그래머스 데브코스 프론트엔드
- 리팩토링 회고
- 백준 js
- 인프런 자바스크립트 알고리즘 문제풀이
- useEffect return
- 모던 javascript Deep Dive
- 프로그래머스 K_Digital Training
- 모던 자바스크립트 TIL
- 모던 자바스크립트 딥다이브
- react customHook 예시
- 투포인터알고리즘 js
- 프로그래머스 데브코스 프론트엔드 TIL
- 프로그래머스 데브코스
Archives
- Today
- Total
프론트엔드 개발자의 기록 공간
[백준 node.js] 1783번_병든 나이트 본문
백준 그리디 알고리즘 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
'알고리즘_JS > 백준_Greedy' 카테고리의 다른 글
[백준 node.js] 1339번_단어 수학 (0) | 2020.12.30 |
---|---|
[백준 node.js] 1449번_수리공 항승 (2) | 2020.12.29 |
[백준 node.js] 2437번_저울 (0) | 2020.12.28 |
[백준 node.js] 4796번_캠핑 (2) | 2020.12.27 |
[백준 node.js] 1744번_수 묶기 (0) | 2020.12.26 |
Comments