20220716_TIL_알고리즘 1일차 복습

codeing999·2022년 7월 16일
0

TIL/WIL

목록 보기
1/22


항해 중

어제 공부한 알고리즘 복습

01번문제 <2016년>

function solution(a, b) {
    var daysofmonth = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30]; //11월까지만 필요
    var dayoftheweek = ['FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED', 'THU'];
    var days = b-1;
    for (var i =0; i<a-1; i++){
        days += daysofmonth[i];
    }
    var answer = dayoftheweek[days%7];
    return answer;
}

@ 바뀌지 않는 변수들은 const로 선언하는게 좋지 않았을까 싶다.
@ 날짜에 관한 문제여서 Date 관련 함수들을 써서 풀었어도 됐을 것 같다.

02번문제 <나누어 떨어지는 숫자 배열>

function solution(arr, divisor) {
    var temp = [];  //빈 어레이
    var idx = 0;
    for (var i =0; i<arr.length; i++){
        if ( arr[i] % divisor == 0)
            {
                temp[idx] = arr[i];
                idx++;
            }
    }
    
    var answer = temp.sort(function(a, b){  //문자로 받아들여서 이렇게 해야된다고하네
                           return a-b;
                           });
    if (answer.length == 0)
        return [-1];    //이게 되네
    return answer;
}

@ 3~10번줄 수정버전
for (let e of arr)
if ( e % divisor == 0) temp.push(e)

@ 근데 이걸 더 잘 할 수 있는 함수 filter가 있다. 조건에 맞는 원소만 필터링해서 새로운 배열에 넣어줄 때 쓴다고 한다.
화살표 함수까지 써서 더욱 간단하게. 화살표 함수가 정확히 뭔지는 다음에 다른 글에 써봐야겠다.
temp = arr.filter(x => x % divisor == 0)

@ sort()로 배열 안의 숫자들을 정렬하더라도 sort는 쟤네를 문자로 받아들여서 12를 3보다 더 작다고 판단한다고 한다. 앞이 1이라서. 그래서 저렇게 뒤에 뭘 더 붙여야 한다. a-b 리턴하면 오름차순, b-a 리턴하면 내림차순.

@ sort()함수 쓴 부분도 화살표 함수 써서하면
sort((a, b) => a-b)

03번문제 <수박수박수박수박수박수?>

function solution(n) {
    var answer = '';    //빈문자열 ""도 가능
    for (i = 1; i<=n; i++){
        if (i%2 == 1)
            answer+='수';
        else
            answer+='박';
    }
    return answer;
}

@ 지금 다시하면

for (i = 1; i<=n; i++)
        (i%2 ? answer+='수' : answer+='박')

이렇게 3항연산자 썼을 것 같다.

04번문제 <완주하지 못한 선수>

function solution(participant, completion) {
    let part2 = participant.sort()
    let comp2 = completion.sort()
    for (let i = 0; i< part2.length; i++){
        if (part2[i] != comp2[i]) return part2[i];
    }
}

@ 어제 풀 당시엔 답은 맞췄는데 수행시간이 너무 길어서 통과 못했던 문제. 어떻게 풀어야할지 쉬운 방법이 떠오르지 않았다가 팀원꺼보고 힌트얻고 수정해 봄. 정렬한 뒤에 처음부터 순서대로 비교하다가 다를 때가 정답.

05번문제 <이상한 문자 만들기>

function solution(s) {
    let arr = s.split(' ');
    let answer = '';
    for (let i = 0; i <arr.length; i++){
        for (let j = 0; j <arr[i].length; j++)
            if (j % 2 == 0){
                answer+=arr[i][j].toUpperCase();
                //arr[i][j] = arr[i][j].toUpperCase(); //왜 이렇게 하면 바뀐게 안들어가고 그대로 일까?
                //console.log(arr[i][j]);
            }
            else{
                answer+=arr[i][j].toLowerCase();
                //arr[i][j] = arr[i][j].toLowerCase();
            }
        if (i != arr.length -1) answer+= ' '
    }
    return answer;
}

@ 이거도 해맸던게

arr[i][j] = arr[i][j].toUpperCase();

이 부분에서 arr의 값이 대문자로 안바뀌고 그대로 있다. 리턴한 대문자가 들어가야 맞는거 아닌가? 질문 올려봐야겠다.

06번문제 <자릿수 더하기>

function solution(n)
{
    let sum = 0;
    while (n/10 != 0){
        let l = n%10;
        n = Math.floor(n/10)
        sum += l;
    }
    let answer = sum;

    return answer;
}

@ 이 문제는 별거 없었다. 여기서 쓴 10으로 나눠주면서 숫자의 한자리씩 구하는 while문은 이 뒤로도 계속 쓰긴했는데, 뭔가 함수를 쓰는 방법이 있을 거 같긴하다. 지금 생각해보니 숫자를 문자로 바꾼 다음 인덱스로 접근해도 됐긴하겠다.

profile
코딩 공부 ing..

0개의 댓글