지금까지는 큰 틀을 제목으로 잡고 그 안에서 여러 주제들에 대해서 포스팅했었다. 오늘부터는 세부적인 것을 주제로 잡고 포스팅할 생각이다.
오늘 알고리즘 시간에 프로그래머스 4문제를 풀어봤다.
어찌나 어렵던지 ;;
직접 풀이를 해보고, 멘토님과 같이 풀이를 해보고, 함수를 활용해서 더 짧게 풀이도 해보고 또 제출하면서 다른 사람의 풀이까지 보니까 내 자신이 한 없이 작아진다...
오늘 알고리즘 시간에 활용한 함수는 reduce() 와 map ()이다.
프리캠프를 하는 동안 알고리즘 문제를 풀면서 활용도 해봤고 검색하면서 봤던 메서드 들이라 친근했다.
우선 두개의 메서드는 반복적인 연산? 을 한다는 공통점을 가지고 있다 하지만 조금 다르긴하다.
첫 번째는 reduce는 map이나 forEach와 같이 콜백 함수를 전달받는데, 얘네들의 parameter가 map, forEach와는 조금 다른데, reduce에서 콜백 함수가 동작할 때 return 하는 값이 다음 콜백 함수의 첫 번째 파라미터로 전달된다. 그리고 마지막 콜백 함수가 동작한 이후의 return 값이 reduce의 return 값이 되는 거다.
프로그래머스의 문제로 reduce가 어떻게 활용되는지 보자.
/*
문제 설명
자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
제한사항
N의 범위 : 100,000,000 이하의 자연수
*/
function solution(n) {
const answer = String(n)
.split("")
.reduce((cu, el) => {
return cu + Number(el);
}, 0);
return answer;
}
map은 filter 나 foreach와 같은 구문을 가진다. map()메서드는 배열 내의 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열에 대해서 return 한다.
프로그래머스의 예제에서 확인해보자
/*
문제 설명
함수 solution은 정수 x와 자연수 n을 입력 받아, x부터 시작해 x씩 증가하는 숫자를 n개 지니는 리스트를 리턴해야 합니다. 다음 제한 조건을 보고, 조건을 만족하는 함수, solution을 완성해주세요.
제한 조건
x는 -10000000 이상, 10000000 이하인 정수입니다.
n은 1000 이하인 자연수입니다
*/
function solution(x, n) {
const answer = new Array(n).fill(1).map((num, i) => {
return (num + i) * x;
});
return answer;
}
아직까지는 그래도 따라갈 수 있는 느낌이 들지만 날이 갈수록 점점 더 어려워 지는 느낌을 받는다. 알고리즘적 사고를 하려고 매일 아침 마다 공부를 한다. 하지만 이건 대체 어떤식으로 훈련을 해야하는지 감이 안잡힌다.
매번 어렵고 내가 이렇게 어렵고 복잡하게 풀었는데 누군가는 아주 간단하게 푸는 것을 볼때 감탄 + 현타? 같은게 오기도 한다.
이번주 금요일에 알고리즘 시험이 있는데 어떻게 봐야하지..? 무섭다. 한 개도 못 맞출것 같다.
그래도 화이팅 해보자!