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"));
자바스크립트도 파이썬도 결국은 프로그래밍 언어이다.
같은 예제를 푸는 방법이 달라보이지만 핵심 아이디어는 같다고 보여진다.
이전에 파이썬을 배울 떄 어려웠던 예제들을
자바스크립트로 풀어봐야겠다!!
'프로그래밍 > Javascript' 카테고리의 다른 글
JavaScript 기초 : 실전 예제 2. 거스름돈 구하기! - Math.floor()와 함수 이용 (0) | 2020.09.17 |
---|---|
JavaScript 기초 : 실전 예제 1. 팩토리얼(factorial) - for 반복문 사용 (0) | 2020.09.17 |
JavaScript 기초 : 자료형 업그레이드 4. 기본형과 참조형 (0) | 2020.09.15 |
JavaScript 기초 : 자료형 업그레이드 3. 문자열 - slice메소드 (0) | 2020.09.14 |
JavaScript 기초 : 자료형 업그레이드 2. Math 객체 (0) | 2020.09.14 |