문제
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return하는 solution을 완성하세요. 'p','y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.
예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.
입출력 예
"pPoooyY" : tru, 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return 합니다.
"Pyy" : false, 'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return 합니다.
나의 풀이1
많이 발전했음에도 불구하고 아직 초보 중에 초보라고 느껴지는게 일단 알고리즘 문제만 보면 i를 for문으로 돌려보고 싶어진다. 그래서 i for문 박치로 시작했다.
function solution(s){
var answer = true;
let countP = 0;
for(let i =0;i < s.length;i++){
if(s[i]==='p'||s[i]==='P'){
countP += 1;
console.log(countP);
}
}
let countS = 0;
for(let j=0;j < s.length;j++){
if(s[j]==='y'||s[j]==='Y'){
countS += 1;
console.log(countS);
}
}
if(countP===countS){
answer = true;
} else {
answer = false;
}
return answer;
}
for문으로 문자열을 한 글자씩 돌려주며 if문을 이용해 문자 한개가 p 또는 P와 같으면 countP가 1씩 증가하도록 했다.
마찬가지로 S도 countS로 개수를 세어 주었다.
마지막으로 countP 와 countS가 같으면 answer에 true를 반환하고, 다르면 false를 반환하도록 했다.
나의 풀이2
우선, 첫 번째 문제풀이에서 원시인마냥 박치기로 풀었기 때문에 조금은 다듬기로 했다. 별 차이는 없겠지만 i를 이용한 for문 보다는 for of 문을 쓰면 조오오오오오금은 나아질 것 같아서 바꾸어보았다.
function solution(s){
var answer = true;
let countP = 0;
for(value of s){
if(value==='p' || value==='P'){
countP += 1;
console.log(countP)
}
}
let countS = 0;
for(value of s){
if(value==='Y' || value==='y'){
countS += 1;
}
}
if(countP===countS){
answer = true;
} else {
answer = false;
}
return answer;
}
지금 정리하면서 보니까 어차피 같은 s라는 값에 대해 동일한 반복문을 돌리고 있기 때문에 p와 s를 구하는 식을 합쳐줘도 될 것 같다.
나의 풀이3
원시인에서 조금 벗어난 것은 만족스럽지 않아 조금만 더 현대인이 되어보기로 했다.
처음 구상했던 방법 중에는 indexOf, filter 등이 있었는데 filter 메서드를 이용해 문제를 풀어 보았다.
let s ='pPoooyY'
let resultP =s.split('').filter((item)=>{
return item === 'p' || item === 'P';
})
let countP = resultP.length;
let resultS =s.split('').filter((item)=>{
return item === 's' || item === 'S';
})
let countS = resultS.length;
if(countP === countS){
answer = true;
return answer;
} else {
answer = false;
return answer;
filter를 쓰기에 앞서 기존의 문자열을 배열의 형태로 바꾸어 주는 작업을 했다.
s라는 문자열을 split('')에 빈문자열을 넣어 한 글자씩 배열에 넣어주었다. 그리고 filter로 반복을 하며 각 문자열이 p와 s가 맞으면 그 값만 담긴 새로운 배열이 만들어지도록 했다.
그 후에 result.length를 해줌으로써 배열의 길이를 세어주었다.(배열의 길이=문자열에서 p와 s의 개수 이기 때문)
마지막으로 countP와 countS를 비교해서 true이면 answer에 true를, false이면 answer에 false를 반환하도록 작성했다.
불꽃 피드백 ( feat. 유덕님 )
1. 기본적으로 문제에서 대소문자를 구분하지 않는다고 했기 때문에 p와 P, s와 S를 따로 구분해줄 필요 없이,
toUpperCase() 혹은 toLowerCase()로 대문자나 소문자로 통일해서 바꿔준 뒤에 문제를 풀면 조금 더 깔끔하게 풀 수 있었다.
2. 나의 풀이는 countP와 countS를 비교해서 맞으면 true 다르면 false를 answer에 반환하는 코드를 짰다.
그런데 조금 더 간결하게 풀면 다음과 같다.
count를 여러번 써줄 필요 없이 return countP===countS를 하게 되면 countS와 countP가 무슨 형태가 되었든 간에 둘이 같다면 true가 리턴될 것이고 다르다면 false가 리턴될 것이기 때문에 위와 같이 한 줄로 작성하면 된다.
참고 코드( feat. 유덕님)
나의 풀이와 같은 방식으로 접근한 풀이이고, 나의 코드에서 지저분한 부분을 없앤 코드이다.
피드백대로 바꾼다면 이런 형태가 아닐까 싶다.
function solution(s) {
let pCount = s.toLowerCase().split("").filter((el) => el === "p").length;
let yCount = s.toLowerCase().split("").filter((el) => el === "y").length;
return pCount === yCount;
}
두 번째 풀이는 s.match(/p/gi) (s에서 모든 p를 찾는다)를 통해 푼 문제였다.
p를 찾게되면 그 p값들을 배열로 반환하고 p가 없다면 빈배열을 내보내는 코드이다.(+ 배열의 길이)
s도 마찬가지로 진행해서 비교한 뒤 비교한 값을 출력하는 코드로 작성을 했다.
const solution = (s) =>
(s.match(/p/gi) || []).length === (s.match(/y/gi) || []).length;
'Algorithm' 카테고리의 다른 글
문자열 내 마음대로 정렬하기 [프로그래머스] (1) | 2023.10.13 |
---|---|
음양 더하기 [프로그래머스] (1) | 2023.10.13 |
문자열의 길이 반환 (0) | 2023.10.12 |
배열에서 짝수만 추출하기 (0) | 2023.10.12 |
버블 정렬 (0) | 2023.10.12 |