드디어 마지막 문제..
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
- 1 ≤ babbling의 길이 ≤ 100
- 1 ≤ babbling[i]의 길이 ≤ 15
- babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
- 즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
- 문자열은 알파벳 소문자로만 이루어져 있습니다.
입출력 예babblingresult
["aya", "yee", "u", "maa", "wyeoo"] | 1 |
["ayaye", "uuuma", "ye", "yemawoo", "ayaa"] | 3 |
입출력 예 설명
입출력 예 #1
- ["aya", "yee", "u", "maa", "wyeoo"]에서 발음할 수 있는 것은 "aya"뿐입니다. 따라서 1을 return합니다.
입출력 예 #2
- ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]에서 발음할 수 있는 것은 "aya" + "ye" = "ayaye", "ye", "ye" + "ma" + "woo" = "yemawoo"로 3개입니다. 따라서 3을 return합니다.
유의사항
- 네 가지를 붙여 만들 수 있는 발음 이외에는 어떤 발음도 할 수 없는 것으로 규정합니다. 예를 들어 "woowo"는 "woo"는 발음할 수 있지만 "wo"를 발음할 수 없기 때문에 할 수 없는 발음입니다.
아기가 발음 가능한 문자가 주어지고, 주어진 배열(babbling) 내에서 아기가 말할 수 있는 요소들을 찾는 문제였다.
처음에는 split()을 이용하려고 했다. 배열에 아기가 말할 수 있는 문자 ["aya", "ye", "woo", "ma"]를 배열 speak에 저장하고, for문을 통해 babbling의 각 요소를 speak의 각 요소로 split()하여 최종적으로 ""만 남은 요소의 개수를 세는 방법을 생각했다.
let speak = ["aya", "ye", "woo", "ma"] for(let i = 0; i < babbling.length; i++){ for(let j = 0; j < speak.length; j++){ babbling[i] = babbling[i].split(speak[j]).join("") } |
split()을 실행하면 배열로 나눠지므로, 다시 join("")을 이용해 붙여 주었다.
하지만 바로 오답이 나왔다. 왜인지 분석해보니..
speak의 한 요소 사이에 다른 요소가 끼어있을 때 문제가 발생한 것이었다. 오우
예를 들어 "yayae"는 아기가 발음할 수 없지만, 위의 코드를 실행하면
"yayae" -> [y, e] -> "ye" -> ""가 되므로 발음이 가능한 단어가 되어버린다.
이 문제를 해결하기 위해 split()이 아니라 replace()를 이용하기로 했다.
for문까지는 똑같은데, speak에 해당하는 문자를 없애는 것이 아니라 1이라는 숫자로 바꿔 주는 것이다.
그렇다면 위에 나온 문자 사이에 문자가 끼어있는 문제도 발생하지 않을 것이고, 조건을 만족하는 요소는 1로만 이루어진 요소가 될 것이다. 오호 ~
for(let i = 0; i < babbling.length; i++){ for(let j = 0; j < speak.length; j++){ babbling[i] = babbling[i].replace(speak[j], 1) } |
- replace() 전 ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]
- replace() 후 ["11". "uuu1", "1", "111", "1a"]
결과는 이렇게 나왔다. 이제 1로만 이루어진 요소들의 개수를 세면 된다.
isInteger()를 통해 요소가 숫자로만 이루어져 있다면 answer에 1씩 더하는 방법을 사용하였다.
function solution(babbling) { var answer = 0; let speak = ["aya", "ye", "woo", "ma"] for(let i = 0; i < babbling.length; i++){ for(let j = 0; j < speak.length; j++){ babbling[i] = babbling[i].replace(speak[j], 1) } if(Number.isInteger(Number(babbling[i]))){ answer++ } } return answer; } |
이로써 0단계를 모두 클리어 하였다. 엄밀히 말하면 안전지대와 겹치는 선분 2문제는 못풀었지만.. 얘네처럼 이게 왜 0단계스러운 문제가 꽤 있었던 것 같다. 으아아아아
사실상 아무것도 없는 상태로 시작했는데, 0단계를 풀면서 여러 함수나 객체등의 사용법과 기능 등 유용한 것들을 배울 수 있어 굉장히 보람찬 시간이었다.
1단계도 파이팅!
'코딩 테스트 풀이 > 프로그래머스' 카테고리의 다른 글
[LV1] 문자열 내 마음대로 정렬하기 (0) | 2023.01.09 |
---|---|
[LV1] 행렬의 덧셈 (0) | 2023.01.08 |
[LV0] 최빈값 구하기 (0) | 2023.01.07 |
[LV0] 캐릭터의 좌표 (0) | 2023.01.04 |
[LV0] 문자열 계산하기 (0) | 2023.01.02 |