[Java] 문자열 내 p와 y의 개수
문제 설명 및 입출력 예시
대문자와 소문자가 섞여있는 문자열 s가 주어지고 s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return하는 solution을 완성하라. 'p','y' 모두 하나도 없는 경우는 항상 True를 리턴한다. 개수를 비교할때 대문자와 소문자는 구별하지 않는다.
예 - s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.
제한사항 - 문자열 s의 길이 : 50 이하의 자연수, s는 알파벳으로만 구성
입출력 예시
s | answer |
"pPoooyY" | true |
"Pyy" | false |
예시 1번 - 'p'의 개수 2개, 'y'의 개수 2개로 같으므로 true를 return합니다.
예시 2번 - 'p'의 개수 1개, 'y'의 개수 2개로 다르므로 false를 return합니다.
코드 & 풀이과정
먼저 문제를 보자마자 소문자와 대문자가 같은 취급을 받는다는게 좀 걸렸다. 왜냐하면 내생각에는 소문자와 대문자는 다른 취급을 받기 때문이다. 따라서 논리연산자를 이용해 'p'와 'P'를 묶고 'y'와 'Y'를 묶을 생각을 했다.
사실 여태까지 문제를 풀면서 charAt를 사용해 한글자씩 빼는건 해봤기 때문에 어렵지 않게 응용할 수 있었다.
따로 a와 b를 선언해주고 a와 b를 각각 비교해서 같다면 true 같지않다면 false를 사용해줬다. 그리고 혹시 몰라 a가 0이고 b가 0이라면 true가 나올 수 있게 해줬다. (이것에 대한 회고는 아래에...)
class Solution {
boolean solution(String s) {
boolean answer = true;
int a = 0, b = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'p' || s.charAt(i) == 'P') {
a++;
} else if (s.charAt(i) == 'y' || s.charAt(i) == 'Y') {
b++;
}
}
if (a == b) {
answer = true;
} else if (a != b) {
answer = false;
} else if (a == 0 && b == 0) {
answer = true;
}
return answer;
}
}
회고
역시나 다른 실력있는 개발자들은 따로 함수를 이용하는 점을 알 수 있었다.
나같은 경우엔 'p'와 'P'는 다르다는걸 알기때문에 논리연산자를 이용해줬지만
바로 받는 String s를 toLowerCase() 함수를 이용하여 다 소문자로 바꿔렸고, 굳이 논리연산자를 이용할 필요가 없다는걸 배웠다.
그리고 나는 a와 b를 받아서 a와b의 같음 다름을 이용하여 풀었다.
그러나 다른 개발자들의 경우에는 int cnt를 받고 'p'라면 cnt++ | 'y'라면 cnt--를 선언하여
마지막 줄에 cnt가 0일시 true 아닐시 false를 return하는 굉장히 컴팩트하고 예쁘게 코드를 작성한걸 볼수있었다.
class Solution {
boolean solution(String s) {
s = s.toLowerCase();
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'p')
cnt++;
else if (s.charAt(i) == 'y')
cnt--;
}
if (cnt == 0)
return true;
else
return false;
}
}
그리고 나같은경우엔 아래에
else if (a == 0 && b == 0) {
answer = true;
}
이부분은 아예 필요가 없었다는걸 문제를 다 풀고 다른분들의 코드를 보며 생각났다.
좀 더 컴팩트하게 짜는 연습을 해야할 듯 하다.
💻프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12916