프로그래머스 코딩테스트 연습 Lv.0 '옹알이(1)' 문제입니다.
https://school.programmers.co.kr/learn/courses/30/lessons/120956
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
❓ 문제 설명
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
< 제한사항 >
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 15
- babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
- 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
※ 아래 입출력 예시를 참고하세요!
⚠️ 입출력 예시
예시 1
babbling ▼
["aya", "yee", "u", "maa", "wyeoo"]
1
//["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐, 따라서 1을 return합니다.
예시 2
babbling ▼
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]
3
// ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은
// "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다.
// 따라서 3을 return합니다.
🔍 알고리즘 구상
- replace()를 이용해 "aya", "ye", "woo", "ma"를 모두 특정 문자로 변환하고
- 문자열을 하나씩 잘라 특정 문자와 비교해서, 특정 문자만 있는 배열의 값은 몇 개인지 구합니다.
✏️ 직접 구현한 코드
❌ 오류 발생 코드
class Solution {
public int solution(String[] babbling) {
int answer = 0;
int notRes = 0;
for(int i = 0; i < babbling.length; i++) {
babbling[i] = babbling[i].replce("aya","*");
babbling[i] = babbling[i].replce("ye","*");
babbling[i] = babbling[i].replce("woo","*");
babbling[i] = babbling[i].replce("ma","*");
}
for(int i = 0; i < babbling.length; i++) {
for(int j = 0; j < babbling[i].length(); j++) {
if(babbling[i].charAt(i) != '*') {
notRes++;
break;
}
}
}
answer = babbling.length-notRes;
return answer;
}
}
- replace() 메서드를 , 이렇게 replce() a를 쓰지 않는 오타를 냈다.
- 이중for문에서 charAt()의 인덱스 값을 j로 주어야 문자열의 모든 값을 char로 변환할 수 있는데, i로 주었다.
⭕ 수정한 정답 코드
class Solution {
public int solution(String[] babbling) {
int answer = 0;
int notRes = 0;
for(int i = 0; i < babbling.length; i++) {
babbling[i] = babbling[i].replace("aya","*");
babbling[i] = babbling[i].replace("ye","*");
babbling[i] = babbling[i].replace("woo","*");
babbling[i] = babbling[i].replace("ma","*");
}
for(int i = 0; i < babbling.length; i++) {
for(int j = 0; j < babbling[i].length(); j++) {
if(babbling[i].charAt(j) != '*') {
notRes++;
break;
}
}
}
answer = babbling.length-notRes;
return answer;
}
}
🗣️ 코드 설명
- 0부터 babbling 배열의 길이보다 작을 때까지 증가하는 i를 증가값으로 가진 for문을 만든다.
- for문 안에서는, replace() 메서드를 사용해, "aya", "ye", "woo", "ma"를 다 *문자로 변환한다.
- 0부터 babbling 배열의 길이보다 작을 때까지 증가하는 i를 증가값으로 가진 for문 안에, 0부터 babbling 배열 안에 있는 문자열의 길이보다 작을 때까지 증가하는 j를 증가값으로 가진 for문을 만든다. 이중for문이다.
- 이중for문 안에서는, charAt() 메서드를 이용해, babbling 배열 안에 있는 문자열을 잘라 비교한다. 만약 *문자 말고 다른 문자가 있다면, notRes에 1을 더 해, 발음할 수 없는 단어의 개수를 notRes에 저장한다. break문을 통해 안쪽 for문을 빠져나온다.
- 발음할 수 없는 단어의 개수를 총 단어의 개수인 배열의 길이에서 빼서, 발음할 수 있는 단어의 개수를 구한다.
🔥 다른 코드와 비교
class Solution {
public int solution(String[] babbling) {
int answer = 0;
for(int i =0; i < babbling.length; i++) {
babbling[i] = babbling[i].replace("aya", "1");
babbling[i] = babbling[i].replace("woo", "1");
babbling[i] = babbling[i].replace("ye", "1");
babbling[i] = babbling[i].replace("ma", "1");
babbling[i] = babbling[i].replace("1", "");
if(babbling[i].isEmpty()) {
answer = answer + 1;
}
}
return answer;
}
}
저와 똑같이 replace()를 사용했네요!!
저는 "aya", "ye", "woo", "ma"를 *문자로 변환한 것처럼, 이 분은 1문자로 변환했습니다.
마지막에는 또 1문자로 변환한 것을 공백으로 변환했습니다.
이렇게 공백으로 변환하면, "aya", "ye", "woo", "ma"를 조합한 값도 공백으로 변환되기 때문에
문자열의 길이가 0(공백)인 경우에 true를 반환하는 isEmpty() 메서드를 사용해 문제를 풀어낼 수 있습니다.
⭐ 기억하고 넘어갈
- isEmpty() : 문자열의 길이가 0(공백)인 경우에 true를 반환
https://codingismylife.tistory.com/70
[JAVA] 메서드 - isEmpty()
🤔 어떤 메서드일까? isEmpty()는 문자열의 길이가 0(공백)이면, true를 반환하는 메서드 입니다. 매개변수는 없다 🔧 메서드 사용법 String empty = ""; String num = "123"; if(empty.isEmpty()) { System.out.println("emp
codingismylife.tistory.com
- replace() : 문자열의 특정한 문자를 원하는 문자열로 변환
https://codingismylife.tistory.com/56
[JAVA] 메서드 - replace(), replaceAll()
🤔 어떤 메서드일까? replace() 와 replaceAll() 메서드는 문자열의 특정 문자를 원하는 문자로 변환하는 메서드입니다. replace() replace(CharSequence target, CharSequence replacement) 첫 번째 매개변수는 변환하고
codingismylife.tistory.com
'코딩테스트 회고록 > 코테_Java' 카테고리의 다른 글
[JAVA] 프로그래머스 - 둘만의 암호 (1) | 2024.03.08 |
---|---|
[JAVA] 프로그래머스 - A 강조하기 (0) | 2023.05.02 |
[JAVA] 프로그래머스 - 문자열안에 문자열 (0) | 2023.04.05 |
[JAVA] 메서드 - contains() (0) | 2023.04.05 |
[JAVA] 프로그래머스 - 피자 나눠 먹기 (3) (0) | 2023.03.31 |