[Problem]
1 번 문제에 대한 접근 방식이 문제였다. 접근 방식은 입력 받은 값들을 대문자나 소문자로 통일 시켜주고 거기서 p의 개수와 y의 개수를 확인하고 비교하여 값이 같으면 true를, 다르면 false를 반환한다. 이 때 특정 단어나 글자를 찾을 수 있는 메소드가 필요했다.
[Try]
@ match 메소드
match 함수는 특정 텍스트 안에 찾을 글자나 단어를 포함되어 있는지 확인할 수 있다. 단어나 글자를 확인도 가능하지만 정규표현식을 사용하여 특정 패턴을 검색하는 것 역시 가능하다. 비슷한 함수로는 indexOf 함수가 있다. 그러나 indexOf는 특정 위치값을 index로 반환하므로 위치 확인을 위한 방법에 더 많이 활용된다.
예시 코드
let str = 'Hello world'
console.log(str.match('H'))
[ 'H', index: 0, input: 'Hello world', groups: undefined ]으로 출력된다.
@ 정규표현식(Regular Expression)
정규 표현식은 문자열에서 특정 문자, 특정 문자 조합을 찾기 위한 패턴이다. 객체로서 RegExp의 exec()와 test() 메서드를 사용할 수 있고, String의 match(), matchAll(), replace() 등의 메서드에서도 함께 사용할 수 있다.
- 정규 표현식은 두 가지 방법으로 만들 수 있다.
① 슬래시로 패턴을 감싸서 작성
const re = /ab+c/
② RegExp 객체의 생성자 호출
const re = new RegExp('ab+c')
플래그를 활용하면 조금 더 고급 탐색을 할 수 있다.
i ==> 대소문자를 구분하지 않음.
g==> 전역 탐색
- 추가 정보 -
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Regular_Expressions
구글링을 통해 위에 match 메소드와 정규표현식의 정보를 얻을 수 있었다. 두 개를 이용해 작성한 코드는 밑과 같다.
function solution(s){
return s.match(/p/ig).length == s.match(/y/ig).length
}
But 모든 테스트코드를 통과하지 못했다.
[Solution]
다시 깊이 생각해본 결과 코드에서 빠진 부분이 있었다. 바로 p나 y가 없을 경우를 생각하지 않았다. 따라서 추가적으로 이부분을 포함해서 코드를 작성했다.
function solution(s){
return (s.match(/p/gi)||[]).length == (s.match(/y/gi)||[]).length
}
[]을 넣고 논리합 연산자를 통해 p와 y가 없을 경우에도 0이라는 값을 얻을 수 있게 했다.
[Conclusion]
다른 방법을 생각했을 때 대문자나 소문자로 통일을 하고 split 메소드를 이용해서 해결할 수 있는 방법도 있어 보인다.
split은 구분자를 기준으로 문자열을 잘라 배열로 입력할 때 사용하는 메서드이다.
function solution(s){
return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}
이렇게도 해결가능하다.
이번 과제를 통해 String 메소드에 대한 다양한 방법을 조금 습득할 수 있었다. String 메소드를 따로 정리해서 여러 예시를 적용해볼 필요가 있어 보인다.
- String 메소드 정리 -
http://www.tcpschool.com/javascript/js_standard_stringMethod
'Self Dev. > TIL' 카테고리의 다른 글
2023.04.15 TIL - 문자열 다루기 기본 (0) | 2023.04.15 |
---|---|
2023.04.10 TIL - 화살표 함수와 this 바인딩 (0) | 2023.04.10 |
2023.03.31 TIL - 풀스택 미니프로젝트(books-books) (0) | 2023.04.02 |
2023.03.29 TIL - 풀스택 미니프로젝트(books-books) (0) | 2023.04.01 |
2023.03.26 - 토이 프로젝트 (점심 메뉴 월드컵) (0) | 2023.03.26 |