❗ 문제
출처: 프로그래머스 코딩 테스트 연습,
https://school.programmers.co.kr/learn/courses/30/lessons/120912
머쓱이는 행운의 숫자 7을 가장 좋아합니다.
정수 배열 array가 매개변수로 주어질 때,
7이 총 몇 개 있는지 return 하도록 solution 함수를 완성해 보세요.
❓ 나의 풀이
function solution(array) {
let answer = 0;
array.forEach((el) => {
// el을 문자열로 변환하고 '7'을 기준으로 분할한 배열의 길이에서 1을 뺌
answer += el.toString().split('7').length - 1;
});
return answer;
}
toString, split, length 를 이용해서 문제를 풀었다.
우리는 7이 총 몇 개인지 구해야 한다.
문제를 보고 처음에는 toString() 메서드를 이용해서 요소들을 문자열로 변환해 준 뒤,
includes("7") 이런 식으로 구해주려고 했었는데 이렇게 풀면 77 의 개수를 1로만 카운트하는 문제가 발생한다.
그래서 split() 메서드를 이용해서 다시 풀었다.
동일하게 toString() 메서드를 이용해서 요소들을 문자열로 변환해 준 뒤,
split("7")을 사용하면 "7" 을 기준으로 나뉜 배열이 생성되고, 배열의 길이에서 1을 뺀 값이 "7"의 개수가 된다.
테스트 케이스를 보면 array 가 [7, 77, 17] 로 주어져있다.
이걸 toString() 메서드를 이용해서 문자열로 변환하면 "7", "77", "17" 가 되고,
요소들을 split("7") 을 이용해서 "7" 을 기준으로 나눈다. 그러면
"7" -> [" ", " "]
"77" -> [" ", " ", " "]
"17" -> ["1", " "]
이렇게 나눠지는데 이때, 배열의 길이에서 1을 빼면, 그 문자열에 포함된 "7" 의 개수가 된다.
++) 배열의 길이에서 1을 빼야 하는 이유?
split() 메서드는 문자열을 특정 구분자를 기준을 나누어서, 구분자 사이에 있는 부분문자열들을 배열로 반환한다.
예를 들어,
"7" 이 없는 문자열이면 구분자가 없으므로 원본문자열이 그대로 남고,
const str = "123";
const result = str.split("7");
console.log(result); // ["123"]
구분자가 연속해서 나타나면, 빈 문자열이 포함된다.
const str = "7a7b7c7";
const result = str.split("7");
console.log(result); // ["", "a", "b", "c", ""]
그래서 split("7") 을 사용할 때, 구분자 "7" 이 문자열에 여러 번 등장하면
구분자 사이와 구분자 전후에 빈 문자열이 포함된 배열이 생성된다.
즉, 구분자 개수 + 1이 배열의 길이가 되는 것이다. 그래서 -1 을 해주면 구분자의 개수를 구할 수 있게 된다.
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 약수의 합 (Level 1, JavaScript) (0) | 2024.08.27 |
---|---|
[프로그래머스] 세균 증식 (Level 0, JavaScript) (0) | 2024.08.12 |
[프로그래머스] 커피 심부름 (Level 0, JavaScript) (0) | 2024.07.31 |
[프로그래머스] 모음 제거 (Level 0, JavaScript) (0) | 2024.07.30 |
[프로그래머스] 배열 만들기 3 (Level 0, JavaScript) (0) | 2024.07.26 |