728x90
문제
https://www.acmicpc.net/problem/14890
풀이
문제에 주어진 지도를 가로줄을 검증한다.
오른쪽의 블럭이 왼쪽 보다 클 경우는 이전까지의 평지의 길이를 비교해 경사로를 놓을 수 있으면 넘어가고, 왼쪽블럭이 더 큰 경우는 평지의 길이에서 미리 경사로 설치에 필요한 길이를 빼준다. 이 부분에 대해 설명하자면, 뒤에 평지가 나오면 더해지기 때문에 놓을 수 있다면 하나씩 늘어나 양수가 되지만 놓을 수 없다면(더 크거나 작은 블럭이 있는 경우) 음수가 되기 때문에 반복문을 탈출한다.
이후 가로 세로를 변경해 한번 더 반복한다.
코드
const { link } = require('fs');
const input = require('fs')
.readFileSync(process.platform === 'linux' ? '/dev/stdin' : __dirname + '/example.txt')
.toString().trim().split('\n').map(e => e.split(' ').map(Number))
const [n, l] = input.shift();
let map = input.slice();
let answer = 0;
let newMap = Array.from(Array(n), () => Array(n));
for (let i = 0; i < n; i++){
const checkArr = map[i];
let sameL = 1;
for (let j = 1; j < n; j++){
if (checkArr[j] === checkArr[j - 1]) sameL += 1;
else if (checkArr[j] - 1 === checkArr[j - 1] && sameL >= l) {
sameL = 1;
}
else if (checkArr[j] + 1 === checkArr[j - 1] && sameL >= 0) {
sameL = 1 - l;
}
else {
sameL = -1;
break;
}
}
if (sameL >= 0) {
answer += 1;
}
}
for (let i = 0; i < n; i++){
for (let j = 0; j < n; j++){
newMap[j][i] = map[i][j];
}
}
for (let i = 0; i < n; i++){
const checkArr = newMap[i];
let sameL = 1;
for (let j = 1; j < n; j++){
if (checkArr[j] === checkArr[j - 1]) sameL += 1;
else if (checkArr[j] - 1 === checkArr[j - 1] && sameL >= l) {
sameL = 1;
}
else if (checkArr[j] + 1 === checkArr[j - 1] && sameL >= 0) {
sameL = 1 - l;
}
else {
sameL = -1;
break;
}
}
if (sameL >= 0) {
answer += 1;
}
}
console.log(answer);
728x90
'코딩 테스트 > 백준' 카테고리의 다른 글
[Node.js] 16234_인구 이동 (0) | 2024.05.10 |
---|---|
[Node.js] 14502_연구소 (0) | 2024.05.09 |
[Node.js] 15686_치킨배달 (0) | 2024.05.08 |
[Node.js] 15683_감시 (0) | 2024.05.06 |
[Node.js] 1972_놀라운 문자열 (0) | 2024.05.03 |