[TIL] d+6

river·2022년 3월 12일
0

첫 주가 끝나간다!
오늘도 알고리즘!

프로그래머스 자바스크립트 알고리즘



음양 더하기

function solution(absolutes, signs) {
    let a = 0;
    let b = 0;
    let sum = 0;

        for(let i=0; i<absolutes.length; i++) {
            a = absolutes[i]*(signs[i]-1)
            b = absolutes[i] + a
            sum += a  
            sum += b
        } return sum
}

true와 false가 1과 0인 점을 이용해 absolutes에 signs[i]-1([0,-1,0])을 곱해 음수가 담긴 배열 a를 만들고, absolutes에서 음수의 배열인 a를 더해 양수가 담긴 배열 b를 만들어 모두 더해주었다... 더 개선이 가능할 것 같은데 너무 지저분하게 짜놨다. ㅠ




평균 구하기

function solution(arr) {
    let answer = 0;
    let a = 0;
    for (let i = 0; i < arr.length; i++) {
        a += arr[i]
    }  
    answer = a/arr.length;
    return answer
}

배열 arr의 데이터를 arr의 길이만큼 반복해서 더해주고, 이를 다시 arr배열의 길이로 나누어 평균값을 구해줌.





핸드폰 번호 가리기

function solution(phone_number) {
    let answer = '';
    let star = phone_number.slice(0,-4);
    
    answer = phone_number.replace(star, '*'.repeat(star.length));
    
    return answer;
}

phone_number의 뒷 4자리만을 남겨놓고 잘라내기 위해 slice()를 사용.
4자리를 남기고 잘라낸 숫자를 *표시로 변경 - 한 글자마다 하나의 별로 변환하기 위해 별의 갯수를 잘라낸 숫자의 길이star.length만큼 반복하여 재배치한다. -

.slice(start,length) : start로부터 length까지의 숫자를 잘라 꺼내 새로운 배열을 생성한다. 원본 배열은 변경되지 않는다. b를 작성하지 않고 a 로부터 배열의 끝까지를 추출함. 음수를 사용해 배열의 뒷자리부터 인덱스를 셀 수 있음. (문자열에도 적용이 가능.)

비슷한 기능을 하는 메소드로 substr substring 등이 있으나, substr은 더이상 권장되지 않고, substring은 음수 사용이 불가능하다.




행렬의 덧셈


function solution(arr1, arr2) {
    let answer = [];
    
    for (let i = 0; i < arr1.length; i++) {
        let sum = [];
        for (let j = 0; j < arr1[i].length; j++){
        sum.push(arr1[i][j]+arr2[i][j]);
        // console.log(sum)
        }
        answer.push(sum);
    } 
    return answer;
}

와 이건 결국 못 풀어서 다음날 뒤늦게 풀고 추가함.
arr1과 arr2의 각 항 속 항의 합을(ㅋㅋ) 구하기 위해 반복문을 중첩시켜 arr의 각 항, 그리고 arr의 각 항 속의 각 항을 꺼내 합하는 방식. 첫번째 반복문에 비어있는 새 배열 만들어 여기에 계속 항의 숫자를 더한 값을 push한다.
주석처리된 위치에서 새 배열sum을 출력해보면 한 번 반복문이 돌 때마다 [4] -> [4,6] 같은 방식으로 sum에 누적되어 들어가는 것을 볼 수 있다. arr[i]의 길이는 2이므로, [4,6]까지 출력과 삽입을 반복한 뒤 멈추고, answer 배열에 삽입되어 [[4,6]]과 같은 모습이 되는데, 여기서 다시 i=1일 경우의 j반복문이 돌아 또 [7] -> [7,9] 같은 결과물을 내놓는다. 이 배열을 또 answer에 삽입하면 [4,6]의 뒤로 [7,9]가 삽입되어 [[4,6],[7,9]] 와 같은 결과물을 얻을 수 있다.

x만큼의 간격이 있는 n개의 숫자

function solution(x, n) {
    var answer = [];
    
    for (let i=0; i<n; i++) {
        answer.push(x+x*i)
    }
    console.log(answer)
    return answer;
}

x라는 공차를 가진 n항의 등차수열을 만드는 문제.
answer라는 빈 배열이 x를 n항이 될때까지 더하며 삽입한다.

.push(a) : 배열의 끝에 요소 a를 삽입.




부족한 금액 계산하기

function solution(price, money, count) {
    let total = 0;
 
    total = (price+price*count)/2*(count);

    if(total>money) {
            return total-money
        } else {
            return 0
        }
}

또차수열...!

(첫 가격 + 마지막 가격)/2 * (탄 횟수) 로 내야하는 총 금액을 구한 뒤,
지갑에 있는 금액과 내야하는 금액의 상태에 따라 조건문을 돌려 출력한다.

내야하는 금액total이 지갑 속의 금액money보다 큰 경우, total-money로 부족한 금액을 출력.
그 외의 경우(money>total, money=total)엔 문제의 조건대로 0을 반환한다.




for...in문
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration#for...in_%EB%AC%B8

for...of문
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration#for...of_%EB%AC%B8

예외처리문
https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Control_flow_and_error_handling#%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC%EB%AC%B8



해야 할 일

WIL 작성
못 푼 문제 다시 풀어보기
약속 다녀온 뒤에 강의도 좀 들어야겠다... ㅠ. ㅠ

알고리즘 이틀차...
난이도 중하로 넘어오니까 생각만큼 잘 되지가 않아서 너무 속상ㅡ ㅜ...!!!
그리고 velog 줄바꿈 너무 불편해





profile
가보자고

0개의 댓글