[알고리즘]문자열 탐색:팰린드롬, 숫자만 추출

chaewon Im·2022년 1월 22일
0
post-thumbnail

2.팰린드롬

📃 문제

앞에서 읽을때와 뒤에서 읽을때가 같은 문자열을 팰린드롬이라고 합니다.
문자열이 입력되면 해당 문자열이 팰린드롬이면 Yes,아니면 No를 출력하는 프로그램을 작성하세요.
단, 회문을 검사할 때 알파벳만 가지고 회문을 검사하며, 대소문자를 구분하지 않습니다.

✏️ 내 풀이

  1. 문자열을 소문자 혹은 대문자로 바꾼다음 replace(정규식)을 이용해 알파벳이 아닌 문자를 제거한다.

    • 1-1) [a-z]혹은 [A-Z]하면 소문자/대문자만 선택되고, ^기호는 not의 의미이다. => /[^a-z]는 a부터 z에 속하지 않는 것을 선택하겠다는 의미
    • 1-2) /g는 선택자.global => 해당되는 것을 모두 찾겠다는 뜻. 사용하지 않으면 하나만 찾음.
    • 1-3) i를 함께 쓰기도 하는데 i는 대소문자 구분을 하지 않겠다는 뜻. 만약 /[^a-z]/gi 이렇게 쓰면 대소문자 구별 안하고 모든 문자들이 출력됨.
  2. 문자만 남은 문자열을 반전시킨다. => 이 때 join의 파라미터로 공백 설정을 해주어야 문자열이 모두 연결됨. join()의 기본 구분자는 ,라서 ()으로 두면 ,로 구분된 문자열이 나타남.

  3. string과 reverse가 같은지 확인해서 같다면 answer를 YES로, 아니면 NO로 만든다.

function solution(string){
    string = string.toLowerCase().replace(/[^a-z]/g,'');
    reverse = string.split('').reverse().join('')
    console.log(string,reverse);
    let answer = (string === reverse) ? 'YES' : 'NO'
    return answer
}

let string = 'found7, time: study; Yduts; emit, 7Dnuof'
console.log(solution(string))

3.숫자만 추출

📃 문제

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만듭니다.
만약 'tge0a1h205er'에서 숫자만 추출하면 0,1,2,0,5이고 이것을 자연수를 만들면 1205가 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

✏️ 내 풀이

  1. 문자열에서 정규표현식을 이용해 숫자가 아닌 문자들을 공백으로 대치하여 숫자만 있는 문자열을 만든다. => replace(/[^0-9]/g,'')
  2. 문자열을 정수로 바꾼다. parseInt() 이용.
function solution(string){
    let answer = Number(string.replace(/[^0-9]/g,''))
    return answer
}

let string1 = 'tge0a1h205er'
let string2 = 'g0en2T0s8eSoft'
console.log(solution(string2))

✏️ 다른 방법

코딩인터뷰에서 가끔 메소드를 쓰지 말라고 제한을 걸 수도 있는데 그럴 때 사용할 수 있는 방식 + isNaN()과 for문을 사용하는 방법

  1. isNan()이라는 메소드를 이용해서 해당 문자가 숫자인지 아닌지 확인 가능. Not a Number의 줄임말, 문자에 해당하면 true를 반환.
  2. 이를 이용해 문자열을 순회하면서 isNan 결과가 false이면 해당 문자를 answer에 추가하고, 정수로 변경.

어차피 내 풀이나 for문 풀이나 다 문자열을 순회하기 때문에 시간복잡도는 둘 다 O(n)이다.

function solution2(string){
    let answer = 0
    for(let x of string){
        if(!isNaN(x)) answer = answer * 10 + Number(x)
        /*answer 동작방식-0208 예시:
        answer*10
        -> 0을 만나면(answer가 0인 상태에서 *10)
            => +Number(x) => 0이면 0
        -> 2을 만나면 0(answer가 0인 상태에서 *10)
            => +Number(2) => 0+2 = 2
        -> 0을 만나면 20(answer가 2인 상태에서 *10)
            => +Number(0) => 20+0 = 20
        -> 8을 만나면 200(answer가 20인 상태에서 *10)
            => +Number(8) => 200+8 = 208
        */
    }
    return answer;
}
profile
빙글빙글 FE 개발자

0개의 댓글