본문 바로가기
프로그래밍/Javascript

JavaScript 기초 : 실전 예제 3. 팰린드롬

by 조크리 2020. 9. 17.
반응형

3. 팰린드롬(palindrome)

 

팰린드롬이란 '토마토' '기러기' 처럼 거꾸로 읽어도 똑같은 단어를 말한다. 

 

팰린드롬 여부를 확인할 수 있는 isPalindrome이라는 함수를 작성하는 것이 이번 실전 예제의 목표이다.

 

이 부분도 파이썬 기초 수업을 들었을 때 풀었던 예제이다.

 

매우 어렵게 풀었던 기억이 난다. 

 

일단 문자열의 첫 번째 원소와 마지막 원소를 비교해서 일치 여부를 확인한다.

두 번째 요소와 n-1번째 원소를 비교해서 일치 여부를 확인한다. 

 

인덱스로 더 구체화 시켜보자. 

word의 첫 인덱스 번호는 0이다. 

word의 끝 인덱스 번호는 word.lenth -1 이다. 

 

STEP1.

word[0] 와 word[word.lenth -1]비교 

word[1] 와 word[word.lenth -2]비교 

word[2] 와 word[word.lenth -3]비교 

 

여기서 패턴을 찾아보자.

 

word[i] 와 word[word.lenth -1 -i] 이렇게 수식으로 나타낼 수 있다!!!!!!

 

STEP2.

그럼 i를 0부터 word.lent -1 까지 반복시켜서 찾아야 할까?

아니다. 

어차피 반대쪽과 비교하는 것이기 때문에 

i는 Math.floor(word.lenth / 2) 까지만 반복하면 된다. 

 

코드를 작성해보자. 

word는 isPalindrome의 파라미터로 둔다. 

i 변수는 0부터 시작하고 Math.floor(word.lenght / 2)까지 반복되면서 값은 1씩 늘어난다.

만약 word[i] = word[word.length - 1 - i] 라면 true이고 아니라면 false다. 

// for 반복문 사용 i는 인덱스 값, i가 2/전체 길이 때까지만 반복

function isPalindrome(word) {
  for (let i = 0; i <= Math.floor(word.length / 2); i++ ) {
    if (word[i] == word[word.length - 1 - i]) {
      return true
    }
  }
}

// 테스트
console.log(isPalindrome("racecar"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));
console.log(isPalindrome("123321"));
console.log(isPalindrome("hello"));
console.log(isPalindrome("kayak"));

분명 코드를 맞게 썼다고 생각했는데 true값만 나온다.

 

왜 그럴까?

어떻게 고쳐야 할까?

 

일단 else가 없기 때문에 else를 추가해본다.

 

else를 추가했더니 잘 작동한다!!! 

 

 

if 문의 조건을 좀 바꾸어 보자.

 

 if 문 안에서 

만약 왼쪽 단어가 오른쪽 단어와 같지 않다면

false를 리턴한다.

1쌍이라도 일치하지 않으면 false를 리턴하고 for문으로 돌아간다. 

for문에서 나왔다면 모든 쌍이 일치하는 것이여서 true이다.

// for 반복문 사용 i는 인덱스 값, i가 2/전체 길이 때까지만 반복

function isPalindrome(word) {
  for (let i = 0; i <= Math.floor(word.length / 2); i++ ) {
    if (word[i] != word[word.length - 1 - i]) {
      return false
    }
  }
  return true
}

 

 

for 문 안에서 i가 가운데 글자까지 갈때 까지 

왼쪽 단어와 오른쪽 단어를 비교한다. 

 

좀 더 알아보기 쉽게 왼쪽 글짜를 나타낸다는 left 변수를 만들고 오른쪽 글자를 나타낸다는 right변수를 만들어서 코드를 단순화 시켜보자. 

 

function isPalindrome(word) {

  for (let i = 0; i < Math.floor(word.length / 2); i++) {
    let left = word[i];
    let right = word[word.length - 1 - i]
    if (left != right) {
      return false
    }
  }
  return true
}

// 테스트 코드
console.log(isPalindrome("racecar"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));

 

파이썬에서 해결했던 방법은 아래의 방법과 같다. 

전체적인 흐름은 같다. 

다만

파이썬에서는 for in 을 사용해서 인덱스가 word의 가운데까지 갈 때까지 반복하도록 하였다. 

 

def is_palindrome(word):

    for left in range(len(word) // 2):
        right = len(word) - left - 1
        if word[left] != word[right]:
            return False
    return True 
    
    
            
print(is_palindrome("racecar"))
print(is_palindrome("stars"))
print(is_palindrome("토마토"))
print(is_palindrome("kayak"))
print(is_palindrome("hello"))

JavaScript에서 for in은 객체를 배울 때 배웠다. 

 

객체의 요소들을 콘솔에 출력하는 용도로서 for in 예제를 풀었었다. 

 

자바스크립트에서도 파이썬처럼 사용이 가능하지 않을까???

 

안되나...

function isPalindrome(word) {
  for (i in Math.floor(word.lenth / 2)) {
    let right = word[word.length - 1 - i];
    let left = word[i];
    if (left != right) {
      return false
    }
  }
  return true
}

// 테스트
console.log(isPalindrome("56789"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));
console.log(isPalindrome("123321"));
console.log(isPalindrome("hello"));
console.log(isPalindrome("kayak"));

 

 

자바스크립트도 파이썬도 결국은 프로그래밍 언어이다. 

 

같은 예제를 푸는 방법이 달라보이지만 핵심 아이디어는 같다고 보여진다. 

 

이전에 파이썬을 배울 떄 어려웠던 예제들을 

 

자바스크립트로 풀어봐야겠다!!

 

 

반응형