본문 바로가기
개발 기초 다지기

내일배움캠프 12일차 : 알고리즘 문제 정리

by 너의고래 2024. 4. 30.

알고리즘 문제를 풀다보면 '와... 이 사람은 이걸 어떻게 이렇게 생각했지?'라는 생각이 들 때가 많다. 나도 문제를 풀 수 있긴하나, 아직 기초적인것만 익숙하다보니 하드코딩으로 들어갈 때가 많은데, 앞으로는 내 문제를 풀었더라도 다른 사람의 풀이를 무조건 한개 이상 검토하고 정리하는 습관을 기르려한다.

 

문제 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주가 조금 지난 시점인 지금 놀랍게도 가장 재미있게 하고 있는것이 바로 이 알고리즘 문제 풀기이다. 어린시절 수학문제 풀던 것이 생각나 재밌기도하고, 무엇보다 기초부터 차근차근 코딩을 배워나가는 것 같아 진행하는데 부담이 없는게 큰 것 같다. 뒤로 갈수록 문제가 점점 더 어려워지겠지만, 그만큼 나도 더 잘 할 수 있게 발전해있을테니 매일매일 게으르지 않도록 꾸준히 해나가 코딩 기본기를 단단히 다질 수 있도록 해야겠다.

댓글