문제 설명
대문자와 소문자가 섞여있는 문자열 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 합니다.
문제를 처음 읽고 문자열 s
를 char 배열
로 바꾸고, p의 개수와 y의 개수를 각각 나누어서 세면 될 것 같다고 생각을 하였다.
그래서 다음과 같이 작성을 하였다.
import java.util.Arrays;
class Solution {
boolean solution(String s) {
boolean answer = true;
int pCount = 0;
int yCount = 0;
char[] arr = s.toCharArray();
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 'p' || arr[i] == 'P') {
++pCount;
}
if (arr[i] == 'y' || arr[i] == 'Y') {
++yCount;
}
}
if (pCount == yCount || (pCount == 0 && yCount == 0)) {
answer = true;
} else {
answer = false;
}
return answer;
}
}
p의 개수를 저장할 변수 pCount
와 y의 개수를 저장할 변수 yCount
를 각각 선언한 다음 char 배열
도 선언하였다.
그리고 for문
을 활용하여 arr
의 원소들을 하나씩 순회하면서 p, P, y, Y가 각각 배열에 있는지 확인한다.
배열에 존재한다면 Count
를 하나씩 올려 값을 더한다.
만약 pCount
와 yCount
의 값이 같거나, 두 값 모두 0일 경우 true
를 return하도록 하였고, 아닐 경우 false
를 return하도록 하였다.
그러면 다른 사람이 짠 코드를 한 번 살펴보겠다.
class Solution {
boolean solution(String s) {
s = s.toUpperCase();
return s.chars().filter(e -> 'P' == e).count() == s.chars().filter(e -> 'Y' == e).count();
}
}
주요 로직을 설명하자면
s.toUpperCase()
를 사용하여 문자열 s
의 모든 문자를 대문자로 변환한다. 이유는 대문자와 소문자를 구분하지 않고 쉽게 비교하기 위해서이다.
s.char()
은 문자열 s
를 아스키코드 값 스트림으로 변환한다.
예를 들어 "PPYY" 를 [80, 80, 89, 89]로 변환한다.
.filter(e -> 'P' == e)
는 스트림에서 'P'에 해당하는 문자만 필터링한다.
예를 들어 [80, 80, 89, 89]에서 P에 해당하는 아스키코드 값인 [80, 80]만 남긴다.
그리고 .count()
를 사용해서 필터링된 스트림의 요소 수를 계산한다.
[80, 80]이라면 2가 나온다.
마지막으로 비교를 하게 된다.
s.chars().filter(e -> 'P' == e).count()
: 'P'의 개수를 반환
s.chars().filter(e -> 'Y' == e).count()
: 'Y'의 개수를 반환
두 값이 같다면 true
, 다르다면 false
를 반환한다.
내가 작성한 코드와 비교해보면 스트림 API를 활용해서 대소문자 변환, 필터링, 개수 비교를 비교적 간결하게 처리하였다.
또한 뿐만 아니라 확장성 면에서도 다른 문자 개수 비교 문제에도 보다 쉽게 적용이 가능하다는 장점이 있다.
스트림 API를 공부해서 실제 알고리즘 문제에 적용할 수 있으면 좋겠다.
'problem solving' 카테고리의 다른 글
[프로그래머스] 정수 내림차순으로 배치하기 (0) | 2024.12.01 |
---|---|
[프로그래머스] 대문자와 소문자 (0) | 2024.11.28 |
[프로그래머스] 두 수의 연산값 비교하기 (0) | 2024.11.27 |
[프로그래머스] 가위 바위 보 (0) | 2024.11.26 |
[프로그래머스] 배열 비교하기 (0) | 2024.11.26 |