JS 알고리즘 문제풀이/섹션 3. 문자열 탐색 5

5.문자열 압축

📌강의 정리 문자열의 개수가 문자옆에 쓰여져서 압축하는 문제이다. s[i]와 s[i+1]을 비교하는데 cnt는 항상 1개있으니까 cnt=1로 해야한다. 반복을 하면서 달라지면 문자를 넣어주고 cnt를 넣어준다. 그 이후 cnt를 1로 초기화 해준다. 반복하면서 cnt가 1이면 cnt는 넣어주지 않는다. 마지막에서는 비교할게 없으므로 빈 문자를 하나 넣어야 한다. 코드 짤때 주의할 점은 포문의 한계값을 정할때 s.length-1을 해야한다는 점이다. 이제 if로 cnt가 1보다 클때만 cnt를 String(cnt)로 추가해준다. 📌느낀점 나랑 푼방식은 같지만 세세한점이 달랐다. 나는 마지막에서 비교할때 undefined로 사용했지만 강사님은 따로 빈문자를 넣어 좀 더 확실하게 하였고 그래서 반복횟수도 -1..

4.가장 짧은 문자거리

📌강의 정리 문제만 읽고 이해가 안될때는 입력과 출력을 보고 다시 문제를 이해해보자. 매 문자마다 e가 어디있는지 판단하면서 코드를 작성할수는 있지만 그건 힘든일이다. 포문을 정방향으로 한번돌고 역방향으로 돌면 해결할 수 있다. 시간 복잡도는 O(N)이다. 2N처럼 계수는 생략한다. p라는 변수를 1000으로 하고 e를 만나지않으면 ++해준다. e를 만나면 p를 0으로 초기화해준다. 그럼 answer = 1001, 0, 1,2,3,0,1,2,3,4,0이 된다. 이 의미는 자기 왼쪽에 e와 떨어진 거리를 의미한다. 따라서 처음의 p가 1001처럼 큰값을 받은것이다. 그럼 이제 포문을 역방향으로 가면 또 같은방법으로 하면 된다. p가 계속 ++되며 바뀌는 그 방법이다. 이때 answer를 바꿔주는데 최소값을..

3.숫자만 추출

📌강의 정리 문자와 숫자가 섞여서 들어온다. 숫자만 뽑아내어 더하여 parseInt하면 앞의 0은 사라진다. isNaN(x)이면 x가 숫자인지 확인하는 메서드가 있다. str에서 문자를 하나씩 받아서 isNaN을 x로 받아서 숫자인지 문자인지 if문으로 바로 확인한다. 그래서 나온것을 answer에 누적하여 더하고 parseInt하면 끝이다. 만약 parseInt를 쓰지 말라하면 for문과 if에서 answer에 계속 10을 곱하고 Number(x)로 숫자로 계속 더해가면된다. 수학적인 방법이다. 📌느낀점 나는 전에 봤던 메소드들을 응용하여 풀었는데 강사님은 isNaN으로 한번에 풀었다. 메서드를 쓰는 것이 상당히 의미가 잘통한다 잘알아둬야한다. 하지만 면접에서 메서드없이 수학적인걸 원할수도 있기에 수학..

2.유효한 팰린드롬

📌강의 정리 회문문자열은 영어로 팰린드롬이다. 이번에는 알파벳만 비교해야 한다. 내장함수로 풀어보자. 우선 YES NO 로 받으니 앤서를 예스로 해놓고 소문자화한다음에 리플레이스를 해서 알파벳만 놔두고 나머지문자는 다 없앤다. 이 과정은 정규식으로 쉽게 표현할 수 있다. /[^a-z]/g을 하면 된다. 꺽쇠는 부정의 의미이므로 그 이외의 것들을 다 없애라는 뜻이 된다. g는 글로벌영역 전체를 의미한다. 그 다음엔 빈문자를 넣어주면 된다. s=s.toLowerCase().replace(/[^a-z]g, ''); 를 하면 소문자로 문자만 남길 수 있다. 이제 전에 스플릿과 리버스와 조인을 써서 다시 s와 비교하면 손쉽게 풀 수 있다. 이 문제는 리플레이스에서 정규식이용이 중요하다. 📌느낀점 이제는 정규식과 ..

1.회문 문자열

📌강의 정리 회문문자열은 앞으로 읽으나 뒤로 읽으나 같은 문자열을 의미한다. 그러므로 처음에 투어퍼케이스나 로우케이스로 다 바꿔주면 된다. i가0번일때 3번과 비교하고 1번일때 2번과 비교한다. 따라서 이 방법을 쓸때 전체길이의 절반만 쓰면된다. 문자열의 길이가 홀수 일때도 전체길이의 절반만 돌면된다. 먼저 예스 또는 노로 받으므로 앤서에 처음 예스를 준다. 그 이후 로우케이스로 다 소문자로 바꿔주고 길이를 구해준다. 길이변수는 len으로 이름지어준다. 홀수여도 소수라 상관은 없지만 Math.floor를 해주면 더욱 정확히 할 수 있다. 반복문내에서 이프문으로 초기값과 나중값을 비교한다. 나중값은 len-i-1로 해주면된다. 반복문을 돌며 한번이라도 다른값이 나오면 바로 노를 리턴하면된다. 또다른 방법으..