const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const N = +input[0];
const arr = input[1].split(' ').map(Number);
let answer = 0;
let squence = [];
for (let i = 0; i < N; i += 2) {
squence.push(...arr.slice(i, i + 2));
if (JSON.stringify(squence) === JSON.stringify(squence.toReversed())) {
answer++;
squence = [];
}
}
console.log(answer ? answer : -1);
백준 Node.js 버전이 낮아서 앚기 toReversed 메서드는 지원하지 않아 런타임 에러가 발생한 것으로 추측된다.
toReversed() 대신 slice().reverse() 이렇게 slice와 reverse를 이어서 사용하는 방식으로 해결했다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const N = +input[0];
const arr = input[1].split(' ').map(Number);
let answer = 0;
let squence = [];
for (let i = 0; i < N; i += 2) {
squence.push(...arr.slice(i, i + 2));
if (JSON.stringify(squence) === JSON.stringify(squence.slice().reverse())) {
answer++;
squence = [];
}
}
console.log(answer ? answer : -1);
6
1 1 2 5 3 4
정답: -1
코드가 내놓는 답: 1
입력이 위와 같이 주어졌을 때 처음 0,1번 인덱스가 서로 팰린드롬이므로 answer가 1 증가한다.
하지만 그 뒤에 나오는 수열 2 5 3 4는 팰린드롬이 아니므로, 수열을 모두 팰린드롬으로 나눌수 없기 때문에 -1이 출력되어야 한다.
하지만 처음에 answer 변수가 증가되었기 때문에 1이 출력되어 오답이 나온다.
현재 부분 수열이 팰린드롬이 아닐 경우 check 변수에 false 를 할당해준 뒤, 반복문이 종료되었을 때까지도 false 인 경우 -1 을 출력해줌으로써 해결해주었다.
const filePath = process.platform === 'linux' ? '/dev/stdin' : './Javascript/input.txt';
const input = require('fs').readFileSync(filePath).toString().trim().split('\n');
const N = +input[0];
const arr = input[1].split(' ').map(Number);
let answer = 0;
let check = false; // 모든 부분 수열이 팰린드롬인지 확인
let squence = [];
for (let i = 0; i < N; i += 2) {
squence.push(...arr.slice(i, i + 2));
if (JSON.stringify(squence) === JSON.stringify(squence.slice().reverse())) {
answer++;
squence = [];
check = true;
} else check = false;
}
console.log(check ? answer : -1);
배열을 0번 인덱스부터 N까지 2씩 증가시키며 부분수열을 만들어서 squence 배열에 담아준다.
let squence = [];
for (let i = 0; i < N; i += 2) {
squence.push(...arr.slice(i, i + 2));
. . .
}
그리고 해당 부분수열이 팰린드롬인지 확인한다. (뒤집었을 때 수열이 동일한지 확인)
if (JSON.stringify(squence) === JSON.stringify(squence.slice().reverse())
왜 JSON.stringify() 메서드를 사용해서 비교했는지에 대한 이유는 이 글의 맨 밑에 적어놓았다.
만약 현재 부분 수열이 팰린드롬이라면 answer 변수를 증가시키고, 부분수열을 저장했던 squence 변수를 초기화 해준다. 그리고 check 변수를 true 로 변경해준다.
if (JSON.stringify(squence) === JSON.stringify(squence.slice().reverse())) {
answer++;
squence = [];
check = true;
}
만약 현재 부분 수열이 팰린드롬이 아니라면 check 를 false 로 변경해준다.
else check = false;
최종적으로 check 변수가 false 라면 팰린드롬이 아닌 부분수열이 포함되어 있는 것이므로 -1을 출력하고 true 라면 모든 부분 수열이 팰린드롬이므로 answer 을 출력하여 팰린드롬의 개수를 출력한다.
