[백준] 21925_짝수 팰린드롬 (Javascript)

잭슨·2024년 3월 5일
0

알고리즘 문제 풀이

목록 보기
30/130
post-thumbnail

문제

BOJ21925_짝수 팰린드롬

코드 (런타임 에러)

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);

toReversed()

백준 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;
    }

만약 현재 부분 수열이 팰린드롬이 아니라면 checkfalse 로 변경해준다.

else check = false;

최종적으로 check 변수가 false 라면 팰린드롬이 아닌 부분수열이 포함되어 있는 것이므로 -1을 출력하고 true 라면 모든 부분 수열이 팰린드롬이므로 answer 을 출력하여 팰린드롬의 개수를 출력한다.

profile
지속적인 성장

0개의 댓글