문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
시도
문자열에 인덱스 번호를 지정하기 위해서 split(' ')으로 모든 문자를 한 칸씩 띄어 놓았다. p,P,o,o,o,y,Y 이런 방식으로,
그 다음에 대문자와 소문자를 구별하지 않는다고 했다. 그래서 모든 문자를 대문자로 만들거나 소문자로 만들면 구하기 편하겠다고 생각했다. 인터넷에서 '자바스크립트 소문자 만들기'를 검색했고 매서드 .toLowerCase(); 를 알게 되었다.
그리고 s.toLowerCase()를 했는데 타입에러가 떳다. console.log typeof로 s의 타입을 알아봤는데 객체였다. split(' ')으로
문자를 저렇게 띄어놓으면 문자열String이 아니라 Object가 되서 .toLowerCase()가 적용이 안됐던 것 이다. 이에 대한 것을 찾고 있던 중 그냥 문제열에도 인덱스 번호가 부여되어 있다는 것을 찾았고 split(' ')을 적용하지 않은 채로 .toLowerCase()를 사용했다.
let arr=s.toLowerCase();
변수 arr에 문자가 전부 다 소문자인 문자열을 할당했다.
이제 p와 y의 개수를 비교할 차례다. 처음엔 p와y를 제외한 문자들을 전부 다 날려버릴 생각이었다.
매서드 .아무개(p,y) 이런 식으로 변수에 값만 넣으면 변수를 제외하는 모든 문자열이 날아가는 편리한 매서드가 있을 거라 생각했지만 의외로 없었다. 그래서 p와 y만을 남기는 방법이 없을까 생각하면서 문제와 문제의 예시를 보던 와중에 문득 생각이 들었다.
p랑 y를 남기는게 끝이 아니라 p랑 y의 개수를 비교해야 하는 것, 그리고 비교한 값으로 참, 거짓 값을 리턴하는 것이 목적이라는 것을 깨달았다.
그래서 p랑y를 남기는게 아니라 p만을 추출하고 y만을 추출해서 둘이 비교하면 되겠다는 생각이 들었다.
해결
for(let i=0 ; i<arr.length ; i++){
if(arr[i]=='p'){
p.push(i)
}
else if(arr[i]=='y'){
y.push(i)
}
}
개수를 비교하는 것 뿐이라면 따로 p와 y를 추출한 배열에 값은 의미가 없다고 생각했다.
빈 배열 let p=[ ] 와 let y=[ ]에 arr의 index 번호를 p와 y에 해당할 때 마다 각각 push로 넣었다.
if(p.length==y.length){
answer=true;
}
else{
answer=false;
}
return answer;
}
p와 y의 개수가 같거나 둘 다 없다면 true 다르면 false가 return이 된다. arr의 문자열에 p와y가 없다면
배열 let p와 y의 값도 undifined로 같기 때문에 두 배열의 길이만 비교하면 끝이다.
알게된 점
객체, 배열 형태가 아닌 문자열에도 index번호가 스펠링 하나하나에 부여되어 있다는 점을 알았다.
문자열을 소문자, 대문자로 만드는 매서드가 있다는 것을 알았다.
toLowerCase(소문자),toUpperCase(대문자)
문자를 전부 날려버리고 특정 문자만 남기는 매서드는 없다.
'T.I.L' 카테고리의 다른 글
23-05-29 T.I.L 바닐라 자바스크립트 append() 2 (0) | 2023.05.29 |
---|---|
23-05-28 T.I.L 바닐라 자바스크립트 append() (0) | 2023.05.28 |
23-05-25 T.I.L 비동기 작업의 동기적 표현 Promise + Async/await 로직 해석(콜백함수) (0) | 2023.05.25 |
23-05-24 T.I.L 깊은 복사 알고리즘 (1) | 2023.05.25 |
23-05-23 T.I.L 문자열 내 마음대로 정렬하기 (programmers) (0) | 2023.05.23 |