알고리즘 문제를 풀다보면 '와... 이 사람은 이걸 어떻게 이렇게 생각했지?'라는 생각이 들 때가 많다. 나도 문제를 풀 수 있긴하나, 아직 기초적인것만 익숙하다보니 하드코딩으로 들어갈 때가 많은데, 앞으로는 내 문제를 풀었더라도 다른 사람의 풀이를 무조건 한개 이상 검토하고 정리하는 습관을 기르려한다.
문제 1
각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
- 예각 : 0 < angle < 90
- 직각 : angle = 90
- 둔각 : 90 < angle < 180
- 평각 : angle = 180
제한사항
- 0 < angle ≤ 180
- angle은 정수입니다.
<내가 만든 코드>
function solution(angle) {
var answer = 0;
if (angle < 90) {
answer = 1
} else if (angle === 90) {
answer = 2
} else if (angle > 90 && angle <180) {
answer = 3
} else if (angle === 180) {
answer = 4
};
return answer;
나는 진짜 직관적으로 문제에서 말한대로 조건식을 연결하여 풀었다. 답은 나오긴했지만 불필요하게 길게 늘여 쓴 느낌.
<다른 풀이 1>
function solution(angle) {
return [0, 90, 91, 180].filter(x => angle>=x).length;
}
필터 메소드를 이용한 풀이.
filter를 이용해 각도기의 기준이 되는 숫자들을 순회하며 조건에 맞는 변수의 배열을 찾은 후 length를 통해 배열값의 길이를 반환하도록 만든 코드.
- filter() : 배열의 각 요소를 순회하여 콜백함수를 실행 해 조건에 맞는 요소의 배열을 반환
arr.filter(callback(element[, index[,array]]) [,thisArg]) - .length : 배열과 만났을 때는 배열의 길이를 구해줌
우선적으로는 문제를 통해 조건을 간략하게 생각하는 법을 배워야할 것 같으며, filter()와 같은 함수와 메소드들의 역할도 많이 익혀놔야겠다고 생각하게 만든 풀이.
<다른 풀이 2>
function solution(angle) {
return angle < 90 ? 1 : angle === 90 ? 2 : angle < 180 ? 3 : 4;
}
삼항 연산자를 이용한 코딩이다. 지금까지 내가 본 삼항 연산자는 보통 '? : true 값 : false 값'으로 끝났는데 저렇게 계속 조건과 값을 연결할 수 있는지 처음 알았다. 앞으로 코딩하는데 이용해봐야겠다.
문제2
정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.
제한사항
0 < n ≤ 1000
입출력 예
n | result |
10 | 30 |
4 | 6 |
입출력 예 설명
입출력 예 #1
- n이 10이므로 2 + 4 + 6 + 8 + 10 = 30을 return 합니다.
입출력 예 #2
- n이 4이므로 2 + 4 = 6을 return 합니다.
<내가 만든 코드>
function solution(n) {
var answer = 0;
for(let i=1; i<=n; i++){
if( i % 2 === 0){
answer += i;
}
}
return answer;
}
나는 for문을 통해 추출된 값의 나머지가 0일 경우 추출값끼리 더해주는 코딩을 했다.
i가 1부터 시작하는 이유는 n 정수가 0부터 시작한다고 가정했을 때 0은 포함되지 않는 조건때문이다.
<다른 풀이 1>
function solution(n) {
var half = Math.floor(n/2);
return half*(half+1);
}
이 풀이같은 경우, 내가 수학적 지식 또는 개념이 더 있었다면 만들어낼 수 있었던 코드다. 이번에 접한 김에 머릿속에 넣자.
- 짝수의 값을 모두 더한 공식 = (값을 2로 나눈 값의 정수) * (앞의 정수 +1)
- Math.floor() : 주어진 숫자와 같거나, 주어진 숫자보다 작은 정수중에 가장 큰 수
<다른 풀이 2>
function solution(n) {
var answer = 0;
for(let i=2 ; i<=n ; i+=2)
answer += i;
return answer;
}
위 풀이같은 경우는 애초에 짝수에서 2씩 더해줌으로써 불필요한 순환과 조건부여 과정을 생략했다. 내가 만든 코드에서 조금 더 생각한 업그레이드버전이라고 생각한다. 앞으로 코딩할 때 이렇게 조금 더 줄여나갈 수 있는 부분이 있는지 생각해보아야겠다.
코딩을 시작한지 2주가 조금 지난 시점인 지금 놀랍게도 가장 재미있게 하고 있는것이 바로 이 알고리즘 문제 풀기이다. 어린시절 수학문제 풀던 것이 생각나 재밌기도하고, 무엇보다 기초부터 차근차근 코딩을 배워나가는 것 같아 진행하는데 부담이 없는게 큰 것 같다. 뒤로 갈수록 문제가 점점 더 어려워지겠지만, 그만큼 나도 더 잘 할 수 있게 발전해있을테니 매일매일 게으르지 않도록 꾸준히 해나가 코딩 기본기를 단단히 다질 수 있도록 해야겠다.
'개발 기초 다지기' 카테고리의 다른 글
내일배움캠프 14일차 : 알고리즘 문제 (평균값, 각 자릿수 합, x씩 증가하는 수) (1) | 2024.05.02 |
---|---|
내일배움캠프 13일차 : 자바스크립트 로컬스토리지 (0) | 2024.05.01 |
내일배움캠프 11일차 : 콜백지옥 해결 방법 동기/비동기 (0) | 2024.04.29 |
내일배움캠프 10일차 : Api 불러오기/검색 기능 구현 (1) | 2024.04.28 |
내일배움캠프 9일차 : 자바스크립트 콜백함수 (0) | 2024.04.25 |
댓글