Level 1) 약수의 개수와 덧셈, 문자열 다루기 기본, 부족한 금액 계산하기, 행렬의 덧셈

Doozuu·2023년 2월 8일
0

프로그래머스 (JS)

목록 보기
43/183

📌 문제 1. 약수의 개수와 덧셈

문제 설명

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.

제한사항

1 ≤ left ≤ right ≤ 1,000

입출력 예

left	right	result
13		17		43
24		27		52

풀이

left ~ right 사이에 있는 각 숫자의 약수의 갯수를 구해 짝수면 더하고, 홀수면 빼준다.

  • 반복문이 중첩되어 있어서 시간 복잡도가 O(n^2)이라 효율이 좋지 않다.
function solution(left, right) {
    let answer = 0;
    for(let i=left;i<=right;i++){
        let count = 0;
        for(let j=1;j<=i;j++){
           if(i%j == 0) count++;  
        }
        count % 2 ? answer -= i : answer += i;
    }
    return answer;
}

수학적 성질을 이용한 풀이 ⭐️

어떤 수의 제곱이 되는 수들은 약수의 갯수가 항상 홀수이다.
제곱이 되는 수인지를 확인하려면 제곱근을 취했을 때 정수가 되는지 확인해주면 된다.

  • 시간 복잡도가 O(n) 으로 줄어들어 효율이 더 좋다.
function solution(left, right) {
    var answer = 0;
    for (let i = left; i <= right; i++) {
        if (Number.isInteger(Math.sqrt(i))) {
            answer -= i;
        } else {
            answer += i;
        }
    }
    return answer;
}

⭐️ 정수인지 확인하는 메서드 : Number.isInteger( )




📌 문제 2. 문자열 다루기 기본

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항

s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

입출력 예

s		return
"a234"	false
"1234"	true

풀이

  1. 문자열 길이가 4 혹은 6인가
  2. 숫자로만 구성되어 있는가 -> 정규표현식 이용
function solution(s) {
    if(s.length == 4 || s.length == 6){
        if(/^[0-9]*$/.test(s)) return true;
    }
    return false;
}

정규표현식만으로 문자열 길이와 숫자 구성을 같이 체크

function alpha_string46(s){
  var regex = /^\d{6}$|^\d{4}$/;
  return regex.test(s);
}




📌 문제 3. 부족한 금액 계산하기

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항

놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예

price	money	count	result
3		20		4		10

풀이

기본적인 공식은 다음과 같다.

(부족한 금액) = (예산) - (누적 이용료)

누적 이용료는 아래와 같이 구해줄 수 있다.

누적 이용료 = price x 1 + price x 2 + price x 3 ,,
		 = price x (1부터 count까지의 합)

위의 공식을 이용해 부족한 금액을 구하면, 금액이 부족한 경우에는 값이 음수로 나오게 된다. 부족한 값이 양수로 나오게 하려면 두 가지 옵션이 있다.

  1. 구한 값에 -를 붙이기
  2. 계산 순서를 바꿔서 누적 이용료에서 예산 빼주기
    누적 이용료에서 예산을 빼면 부족한 금액이 양수로 나오기 때문에 -를 곱해주지 않아도 된다.

1번 옵션으로 다음과 같이 풀었다.

function solution(price, money, count) {
    let answer = money - price * (count*(count+1)/2); 
    return answer > 0 ? 0 : -answer; 
}




📌 문제 4. 행렬의 덧셈

문제 설명

행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건

행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.

입출력 예

arr1			arr2			return
[[1,2],[2,3]]	[[3,4],[5,6]]	[[4,6],[7,9]]
[[1],[2]]		[[3],[4]]		[[4],[6]]

풀이

arr1의 값을 각각 대응하는 값을 더한 값으로 바꿔주었다.

⭐️ j의 범위가 arr1.length가 아니라 arr1[i].length 로 해주는 것이 포인트

function solution(arr1, arr2) {
    for(let i=0;i<arr1.length;i++){
        for(let j=0;j<arr1[i].length;j++){
            arr1[i][j] += arr2[i][j];
        }
    }
    return arr1;
}

map을 중첩시켜서 index 속성을 이용해 풀 수도 있다.

function sumMatrix(A,B){
    return A.map((a,i) => a.map((b, j) => b + B[i][j]));
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글