https://school.programmers.co.kr/learn/courses/30/lessons/12916
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
입력으로 주어진 문자열 내에 p와 y의 개수를 비교하는 문제이다.
처음 나의 풀이
function solution(s){
var answer = true;
var p = 0;
var y = 0;
s = s.toLowerCase();
s.split('').forEach(i => {
if (i === 'p') p += 1;
if (i === 'y') y += 1;
})
if (p === y) answer = true;
else answer = false;
return answer;
}
그저 단순하기 짝이 없는 풀이이다.
좀 더 똑똑하게 짜보자.
1. split() 을 사용하는 방법
function solution(s){
s = s.toLowerCase();
return s.split('p').length === s.split('y').length;
}
split(특정 문자)을 사용하면 특정 문자를 기준으로 문자열을 쪼갤 수 있다. 쪼개진 문자열은 배열로 반환되기 때문에 이 배열의 길이를 비교해서 같다면 문자열에 해당 문자의 개수가 같다는 의미가 된다.
사소하게 개선할 수 있는 부분은 조건문을 쓰기보다 return문에 조건을 집어넣어 좀 더 간략하게 만들 수 있다.
2. match() 를 사용하는 방법
match() 는 문자열이 정규식과 매치되는 부분을 검색하는 메소드이다.
정규표현식을 함께 사용하여 패턴을 검사할 수 있다.
console.log(s.match(/p/ig))
console.log(s.match(/y/ig))
// "pPoooyY" -> [ 'p', 'P' ] [ 'y', 'Y' ]
// "Pyy" -> [ 'P' ] [ 'y', 'y' ]
i는 ignore의 약자로, 대소문자를 무시한다는 의미이고,
g는 global의 약자로, 패턴에 해당하는 문자를 모두 찾는다는 의미이다.
출력해보면 위와 같이 정규식과 일치하는 부분을 요소로 가진 배열로 반환되는 것을 알 수 있다.
이를 활용해서 풀이를 개선해보자.
function solution(s){
return s.match(/p/ig)?.length === s.match(/y/ig)?.length;
}
일치하는 값이 없을 경우에는 배열 대신 null을 반환하기 때문에 옵셔널 체이닝을 통해 이 문제를 해결해주었다.
3. reduce() 를 사용하는 방법
reduce() 는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환한다.
리듀서 함수는 callback 함수로, 다음과 같은 네 가지 인자를 받는다.
- accumulator : 누산기. 콜백의 반환값을 누적한 값
- currentValue : 처리할 현재 요소
- currentIndex (option) : 처리할 현재 요소의 인덱스
- array (option) : reduce()를 호출한 배열
arr.reduce(callback[, initialValue])
구문은 이와 같다.
이렇게만 보면 어떨 때에 쓰이는지 감이 안 올 수 있기 때문에 쉬운 예시를 가지고 이해해보자.
배열의 모든 요소를 합하는 예시이다.
const arr = [1, 2, 3, 4, 5]
arr.reduce(function (acc, cur, idx) {
console.log(acc, cur, idx);
return acc + cur;
}, 0);
// 0 1 0
// 1 2 1
// 3 3 2
// 6 4 3
// 10 5 4
initailValue를 0으로 하고 배열의 각 요소(currentValue)를 더해가며 누적한 값을 반환(accumulator)하는 방식으로 동작한다.
reduce() 를 문제에 적용한 풀이이다.
function solution(s){
return [...s.toLowerCase()].reduce((acc, cur) => {
if(cur ==='p') return acc + 1;
else if(cur ==='y') return acc - 1;
return acc;
}, 0) ? false : true;
}
spread 연산자를 통해 주어진 문자열을 소문자로 변환하여 배열을 복사해준 뒤, 리듀서 함수 내에서 각 요소를 처리하고 있다. 이때 p와 y의 개수를 따로 세지 않고, +1 또는 -1씩 카운팅하여 누산값이 0인지 아닌지(개수가 같다면 총합이 0이 될 것이므로)를 검사하는 식으로 해결하였다.
[JavaScript] reduce(리듀스) 함수 알아보기
✔ reduce 함수란? reduce는 사전적으로 줄이다라는 뜻을 가지고 있다. 사전적 의미 그대로, 리듀스 함수는 배열의 요소를 순차적으로 순회하며 숫자든 배열이든 객체든 하나의 값으로 줄여 return 하
5kdk.tistory.com
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
Array.prototype.reduce() - JavaScript | MDN
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
developer.mozilla.org
'알고리즘' 카테고리의 다른 글
[프로그래머스/JS] 기사단원의 무기 (0) | 2024.11.26 |
---|---|
다이나믹 프로그래밍(DP, 동적 계획법)의 특징 / DP 알고리즘 문제 접근법 (1) | 2024.01.05 |
그래프 탐색 알고리즘 DFS/BFS 차이점 및 특징 (0) | 2023.04.13 |
[CaseStudy] 알고리즘 2주차 수업 내용 정리 (0) | 2022.08.10 |