❓ 문제
코딩테스트 연습 - 문자열 내 p와 y의 개수 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
💡 해결하기
이 문제는 여러 가지 방법으로 코드를 작성할 수 있다.
1️⃣ 문자열에서 p와 y의 개수를 모두 세어 각각의 개수를 알아내 p의 개수와 y의 개수가 같은지 확인하기
대소문자를 구별하지 않는다고 하였으므로 주어진 문자열을 우선 모두 소문자로 바꾼다.
그리고 그 문자열의 구성 문자들을 하나씩 모두 돌면서 그 문자가 p일 경우 p의 카운트를 증가시키고, 그 문자가 y일 경우 y의 카운트를 증가시켜 p와 y의 개수를 알아낸다.
마지막으로 p와 y의 개수가 같으면 true를, 다르면 false를 반환하도록 코드를 작성하면 된다.
💻 JS로 코드 작성하기
function solution(s) {
let p_cnt = 0;
let y_cnt = 0;
s.toLowerCase()
.split("")
.map((letter) => {
if (letter == "p") p_cnt += 1;
else if (letter == "y") y_cnt += 1;
});
return p_cnt === y_cnt ? true : false;
}
여기서부터는 다른 사람의 풀이를 가져와봤다.
2️⃣ reduce 사용하기 (누산기 하나를 이용하여 p가 등장할 경우 값을 증가시키고, y가 등장할 경우 값을 감소시킨다.)
역시 먼저 문자열을 모두 소문자로 변환시킨다.
그리고 reduce를 사용하여 값을 누적할 것인데, 문자열의 문자를 하나씩 돌면서 p가 등장하면 누산기의 값을 1 증가시키고, y가 등장하면 누산기의 값을 1 감소시킬 것이다. (초깃값 0)
그렇게 나온 최종적인 누산기의 값이 0이면 p와 y의 등장 횟수가 같다는 의미이므로 true를 반환하면 되고, 누산기의 값이 0이 아니면 p와 y 중 어느 한 쪽의 개수가 더 많다는 뜻이므로 false를 반환하면 된다.
💻 JS로 코드 작성하기
function solution(s) {
return [...s.toLowerCase()].reduce((acc, cur) => {
if (cur === "p") return acc + 1;
else if (cur === "y") return acc - 1;
return acc;
}, 0)
? false
: true;
}
3️⃣ 발상의 전환 (p와 y가 아닌 나머지 문자들도 생각해보기)
이번에는 문자열의 문자들을 모두 대문자로 변환시켜 보겠다.
P를 기준으로 문자열을 나누어 생성된 배열의 길이와 Y를 기준으로 문자열을 나누어 생성된 배열의 길이가 같으면 결국 P와 Y의 개수가 같다는 의미이므로 true를 반환하고, 그렇지 않으면 false를 반환한다.
💻 JS로 코드 작성하기
function solution(s) {
return (
s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length
);
}
문제에서 주어진 첫번째 예제를 적용해 보자.
"pPoooyY" 를 모두 대문자로 변환하면 "PPOOOYY"가 된다.
이를 "P" 기준으로 나누어 배열을 생성하면 ["", "", "OOOYY"] 가 된다.
"Y" 기준으로 나누어 배열을 생성하면 ["PPOOO", "", ""] 가 된다.
두 배열의 크기는 3으로 같다. 이는 문자열을 나누는 기준인 P와 Y의 개수가 같기 때문에 나타날 수 있는 결과이다. P와 Y의 개수가 모두 2개이므로 이를 기준으로 나누어 총 3개의 문자열이 나온 것이다.
'코딩 테스트 연습 > 프로그래머스 level 1' 카테고리의 다른 글
[프로그래머스] lv1. 콜라츠 추측 (JS) (0) | 2023.07.06 |
---|---|
[프로그래머스] lv1. 음양 더하기 (JS) (0) | 2023.07.06 |
[프로그래머스] lv1. 나머지가 1이 되는 수 찾기 (JS) (0) | 2023.07.01 |
[프로그래머스] lv1. 자릿수 더하기 (0) | 2023.04.25 |
[프로그래머스] lv1. 평균 구하기 (2) | 2023.04.25 |
댓글