회문 문자열


:raising_hand: 알고리즘 공부 간 기록이 필요한 문제들에 대한 정리를 기록하는 포스트 입니다.


1. 문제 요건


특정 문자열(String) 이 주어지고 해당 문자열이 회문 문자열에 해당하는지 여부를 판단하라.

2. 코드


  • 기본 솔루션

// 직접비교
function solution(str) {
    let answerFlag = "YES"
    let length = Math.floor(str.length / 2) // 어차피 짝수,홀수 개일경우에도 중간은 검증할 필요가 없음
    str = str.toLowerCase()
    for(let i=0; i<length; i++) {
        if(str[i] !== (str[str.length - i - 1])) {
            answerFlag = "NO"
            break
        }
    }
    return answerFlag
}

let str = "gOdog"


// reverse 사용
function solution2(str) {
    let answerFlag = "YES"
    let length = Math.floor(str.length / 2)
    str = str.toLowerCase()
    // 빈문자열로 split 할 경우 str 이 배열이됨 / str.split('')
    // reverse 는 배열로 변환이 필요함 / str.split('').reverse()
    // join 의 경우 배열을 string 으로 변환함 / str.split('').reverse().join('')
    if (str !== str.split('').reverse().join('')) {
        answerFlag = "NO"
    }
    return answerFlag
}

let str = "gOdog"

3. 결과정리


이 문제는 정말 간단한 회문문자열 검증 문제였다.

먼저 javascript 를 사용하여 알고리즘을 풀때 여러가지 내부 모듈을 사용하게 된다. 이번 문제의 경우 직접 비교하는 방식으로 풀어보았고, 추가적으로 내부모듈(reverse)을 한껏 사용하여 간단하게도 풀어보았다.

풀면 풀수록 느끼는 바이지만 javascript 의 내부모듈은 정말 많고 알면 알수록 좋은것 같다. 다만, 이 많은 내부모듈들을 잘 기억하여 적제 적소에 사용할 수 있도록 많이 연습해야 겠다.

4. Key Point


이번 문제에서 기억해야 할 부분은 크게 3가지가 있다.

  • 아주 기본적인 부분이지만 어떤 값을 비교해서 접근할 때 그들만의 규칙을 찾아내어 한번에 검사할 수 있는지 먼저 고민해보자.

    위 문제의 경우에도 직접비교의 경우에는 아래 규칙을 찾는것이 핵심이라 생각한다.
str[i] !== (str[str.length - i - 1])
  • 반복문을 사용하게 되더라도 불필요한 검증을 반복하는 부분은 고려해보도록 하자

    위 문제에서 직접비교 간 우리는 for 문을 array 의 길이만큼 돌 필요가 없다. 규칙으로 인해서 양쪽 가장자리 부터 검증을 진행하고 있고 때문에 홀수 혹은 짝수의 글자가 오게 되더라도 홀수일 경우는 가운데 글자는 상관이 없고 짝수의 경우는 가운데 글자가 없게 된다.
let length = Math.floor(str.length / 2) // 어차피 짝수,홀수 개일경우에도 중간은 검증할 필요가 없음
  • split , reverse, join

    split 의 경우 특정 문자를 기준으로 분리하는 모듈이다. 위 문제에서는 빈문자 ‘’ 로 split 하여 string 을 배열로 바꾸었다. reverse 는 바뀌어진 배열을 반대로 뒤집어주며 join 으로 다시 합칠 수 있다.