[프로그래머스] 1. 햐샤드 수(Lv1), 2. 최솟값 만들기(Lv2), 올바른 괄호(Lv2)

손규성·2022년 10월 10일
0

alogrithm

목록 보기
6/22
post-thumbnail

Lv. 1: 하샤드 수✍️


문제 설명

  • x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나뉘어져야 한다
  • 예를 들어 18의 자릿수 합은 1 + 8 = 9이고, 18은 9로 나뉘어 떨어지므로 18은 하샤드 수이다
  • 자연수 x를 매개변수로 받고 하샤드 수인지 아닌지 검사하는 함수를 작성해야 한다

제한사항

  • x는 1이상, 10,000이하의 정수이다

나의 답안

function solution(x) {
  let num = x.toString().split('');
  let sum = 0;
  
  for (const value of num) {
      sum += Number(value);
  }
  
  return x % sum === 0 ? true : false;
}
  • x의 각 자릿수 분리 후 더한 값을 찾는다 sum
  • xsum으로 나누어 떨어지면 true, 아니면 false 반환


Lv.2: 최솟값 만들기✍️


문제 설명

  • 길이가 같은 배열 A, B 두개 있다
  • 각 배열에서 한 개의 숫자를 뽑아 두 수를 곱한고, 이 과정을 배열의 길이만큼 반복하며 두 수의 곱한 값을 누적하여 더한다
  • 매개변수로 배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 반환하는 함수를 작성해야 한다

제한사항

  • 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없다
  • 각 배열의 크기는 1,000 이하의 자연수
  • 각 배열의 원소의 크기는 1,000 이하의 자연수

나의 답안

function solution(A, B) {
    let sum = 0;
    
    A.sort((a,b) => a - b);
    B.sort((a,b) => b - a);

    for(let i = 0; i < A.length; i++) {
        sum += A[i] * B[i];
    }
    return sum;
}
  • 최종 누적값이 최솟가 되기 위해서는 큰 숫자와 작은 숫자를 곱해주는 것이 중요하기 때문에 A는 오름차순으로, B는 내림차순으로 정렬한다
  • 각 배열의 길이는 같다고 문제 설명에 기재되어 있기 때문에 for문의 레인지는 AB 중 더 마음에 드는 배열의 length로 설정해준다
  • 각 인덱스에 해당하는 A값과 B값을 곱해주어 누적값sum에 더하고 반환한다

다른 사람 풀이

function solution(A,B){
    A.sort((a, b) => a - b)
    B.sort((a, b) => b - a)
    return A.reduce((total, val, idx) => total + val * B[idx], 0)
}
  • 접근 방식은 나랑 똑같지만 나처럼 반복문을 사용하지 않고 마지막에 reduce로 마무리 했다
  • 간결하다고 무조건 좋은 코드는 아니지만, 간결한 코드를 작성하기 위해서 각 메서드를 확실히 공부하고 자유롭게 활용할 수 있는 것도 중요한 역량인 것 같다
  • 최근 reduce, map, filter에 대한 공부를 하고 블로그 글까지도 작성해두었지만, 아직 익숙해지 않아서인지 이번 문제 풀이에는 활용하지 않았다
  • 다음부터는 for문으로 풀었더라도 메서드 복습 차원에서 코드를 다시 새롭게 작성해보는 것도 좋은 연습이 될 것 같다


Lv. 2: 올바른 괄호✍️


문제 설명

  • 괄호가 바르게 짝지어졌다는 것은 ( 문자로 열렸으면 반드시 짝지어서 ) 문자로 닫혀야 한다는 뜻이다
  • ()로만 이루어진 문자열 s가 매개변수로 주어졌을 때, s가 올바른 괄호인지 아닌지 판단하는 함수를 작성해야 한다

입출력 예

sanswer
"()()"true
"(())()"true
")()("false
"(()("false

제한 사항

  • 문자열 s의 길이는 100,000이하의 자연수

나의 답안

function solution(s) {
    let countA = 0, countB = 0;
    
    if(s[0] === ')') return false;
    
    for(let i = 0; i < s.length; i++) {
        if(s[i] === '(') countA++;
        else countB++;
    }
    return countA === countB ? true : false; 
}
  • 만약 문자열의 첫째 문자가 )인 경우는 무조건 false이기 때문에 예외처리를 우선적으로 해주었다
  • for-loop을 통해 s를 순회하며 문자가 )일 때마다 countA를 올려주고, 반대로 (일 때는 countB를 올려주었다
  • for-loop이 끝난 후에는 두 카운트 수가 동일해야 괄호가 짝지어져서 잘 닫혔다는 의미이기 때문에 두 카운트 값을 비교해서 그에 맞는 boolean값을 반환해준다
profile
블로그 이사 → https://sqsung.tistory.com/

0개의 댓글