코딩테스트 회고록/코테_Java

[JAVA] 프로그래머스 - 옹알이(1)

2023. 4. 5. 22:37
목차
  1. ❓ 문제 설명
  2. ⚠️ 입출력 예시
  3. 🔍 알고리즘 구상
  4. ✏️ 직접 구현한 코드
  5. 🗣️ 코드 설명
  6. 🔥 다른 코드와 비교
  7. ⭐ 기억하고 넘어갈

프로그래머스 코딩테스트 연습 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
  1. ❓ 문제 설명
  2. ⚠️ 입출력 예시
  3. 🔍 알고리즘 구상
  4. ✏️ 직접 구현한 코드
  5. 🗣️ 코드 설명
  6. 🔥 다른 코드와 비교
  7. ⭐ 기억하고 넘어갈
'코딩테스트 회고록/코테_Java' 카테고리의 다른 글
  • [JAVA] 프로그래머스 - 둘만의 암호
  • [JAVA] 프로그래머스 - A 강조하기
  • [JAVA] 프로그래머스 - 문자열안에 문자열
  • [JAVA] 메서드 - contains()
iamjisu
iamjisu
글 솜씨는 없지만 한 글자 한 글자 정성을 다해, 새롭게 배운 것을 정리하고 공부하는 코딩 성장 일기!!
iamjisu
지수의 코딩 발자국
iamjisu
전체
오늘
어제
github 링크
  • 카테고리
    • 개념정리
      • CS
      • MySQL
      • JavaScript
      • Kotlin
      • Java
      • NodeJS
      • Android
    • 코딩테스트 회고록
      • 코테_Java
      • 코테_C언어
    • 오류해결

최근 글

최근 댓글

hELLO · Designed By 정상우.
iamjisu
[JAVA] 프로그래머스 - 옹알이(1)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.