Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

회문 #25

Open
hsskey opened this issue Nov 8, 2024 · 0 comments
Open

회문 #25

hsskey opened this issue Nov 8, 2024 · 0 comments

Comments

@hsskey
Copy link
Owner

hsskey commented Nov 8, 2024

문제 설명

문자열이 팰린드롬(회문)인지 판별

📝 제약조건

  • 대소문자 구분하지 않음
  • 입력 문자열은 알파벳으로만 구성

💡 예시

  • Input: "AICBA"
    • Output: false
  • Input: "abba"
    • Output: true

문제 해결 과정

Step 1: 문제 이해하기

사람이 풀 때는 어떻게 풀까?
→ 양쪽 끝에서부터 하나씩 비교해본다
→ 모든 비교가 같으면 회문이다
→ 하나라도 다르면 회문이 아니다

Step 2: 접근 방법

두 가지 방식으로 접근할 수 있다:

  1. 반복문 접근
i = 0에서 시작
↓
⏺️ // 체크포인트
↓
s[i]와 s[마지막-i] 비교
↓
같으면 -> i++ 후 ⏺️로 돌아감 (단, i가 문자열 길이/2 이하일때만)
다르면 -> false 반환
  1. 재귀 접근
문자열 입력
↓
길이가 1 이하면 -> true 반환
↓
첫글자와 마지막 글자 비교
↓
다르면 -> false 반환
같으면 -> 첫글자와 마지막글자 제외한 문자열로 재귀호출

Step 3: 코드 설계

  1. 입력 문자열을 모두 대문자로 변환
  2. 반복문 또는 재귀로 양 끝단 비교
  3. 결과 반환

Step 4: 코드 구현

// 방법 1: 반복문
/**
 * 
 * @param s {String}
 * @returns {boolean}
 */
function isPalindrome(s) {
    let n = s.length;
    s = s.toUpperCase();
    
    for (let i = 0; i <= parseInt(n/2); i++) {
        if (s[i] !== s[-(i+1)]) {
            return false;
        }
    }
    return true;
}

// 방법 2: 재귀
/**
 * 
 * @param s {String}
 * @returns {boolean}
 */
function isPalindrome(s) {
    s = s.toUpperCase();
    
    if (s.length <= 1) {
        return true;
    }
    
    if (s[0] !== s[s.length - 1]) {
        return false;
    } else {
        return isPalindrome(s.slice(1, -1));
    }
}

이 두 가지 방법 중:

  • 반복문: 메모리 효율적
  • 재귀: 코드가 더 직관적이고 이해하기 쉬움
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant