티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/12916
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 설명
대문자와 소문자가 섞여있는 문자열 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 합니다.
※ 공지 - 2021년 8월 23일 테스트케이스가 추가되었습니다.
나의 풀이
import java.util.*;
class Solution {
boolean solution(String s) {
ArrayList<Character> pArr = new ArrayList<>();
ArrayList<Character> yArr = new ArrayList<>();
for(int i=0; i<s.length(); i++){
if(s.charAt(i) == 'p' || s.charAt(i) == 'P' ){
pArr.add(s.charAt(i));
}
if(s.charAt(i) == 'y' || s.charAt(i) == 'Y' ){
yArr.add(s.charAt(i));
}
}
Boolean result = ((pArr.size() == yArr.size()) ? true : false) ;
return result;
}
}
자바로 코테를 볼 기회가 생겨서 오랜만에 자바로 문제를 풀어보는데 평소 자주 사용하는 자바스크립트의 메서드랑 헷갈려서 실수를 많이 했다,, int를 let을 쓴다던지 .length()를 써야하는데 .length;를 쓰고 .add()를 .push()로 쓰고 있었다. 아주 엉망진창이었다. 그래서 헷갈렸던 부분을 표로 정리해보았다.
ArrayList | char[] , int[] | String | |
구분 | 가변 문자 리스트 | 고정 크기 배열 | 문자열 |
변수 선언 | ArrayList<Character> list = new ArrayList<>(); | char[] arr = new char[5]; | String s = "abc"; |
배열 값 추가 | list.add() | arr[i] = 'a' | |
길이 | list.size() | arr.length | s.length() |
각 요소 접근 | list.get(i) | arr[i] | s.charAt(i) |
나는 p, y 리스트 두개로 선언해서 소문자 대문자 모두 하나의 배열에 담아 그 길이로 비교해서 풀었다. 근데 불필요하게 ArrayList를 쓰는 것 보다 그냥 숫자로 쓰는게 성능상 더 낫다고 한다. 실제로 코테에서도 간단하고 효율적인 방식이 더 나을 것 같다.
더 나은 풀이
class Solution {
boolean solution(String s) {
int p = 0;
int y = 0;
for (int i = 0; i < s.length(); i++) {
char c = Character.toLowerCase(s.charAt(i));
if (c == 'p') p++;
else if (c == 'y') y++;
}
return p == y;
}
}
대소문자 구분은 따로 안하므로 s의 문자열 속 알파벳은 소문자로 통일시켜 놓고, 하나의 문자만 비교해서 카운트를 올리는 게 훨씬 간단하고 쉬운 방법이었다. 좋은 풀이를 보면 코드가 정말 간단하고 읽기 쉬운데, 나는 처음에 문제 풀기에 급급하다 보니 자꾸 길고 복잡하게 작성하는 것 같다. 두 번째 풀 때는 간단하게 작성해서 풀 수 있는 연습을 해야겠다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스|JS] Lv.2 다음 큰 숫자 / split()과 재귀 호출 (0) | 2025.03.30 |
---|---|
[프로그래머스|JS] Lv.1 햄버거 만들기 (0) | 2025.02.24 |
[프로그래머스|JS] Lv.0 배열 자르기 splice() 와 slice() 차이점 (0) | 2024.11.15 |
[프로그래머스|JS] Lv.0 외계행성의 나이 (1) | 2024.11.06 |
[프로그래머스|JS] Lv.1 문자열 섞기 (1) | 2024.10.30 |
- Total
- Today
- Yesterday
- 노마드
- ts
- TypeScript
- nomard
- slice
- CLI
- 리액트
- useState
- Cleanup
- 오블완
- 오버로딩
- React
- create react app
- 자바스크립트
- props
- useEffect
- Async
- 챌린지1일차
- 리액트네이티브
- 프로젝트회고록
- splice
- ReactJS
- 재귀함수
- 티스토리챌린지
- await
- NPM
- overloading
- 프로그래머스
- 타입스크립트
- 카카오로그인
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |