그저 내가 되었고

항해99) 2주차:: Algorithm Mock Test(JS) 본문

개발/항해99 9기

항해99) 2주차:: Algorithm Mock Test(JS)

hyuunii 2022. 9. 27. 18:51

1번. 자연수 뒤집어 더하기 (하)

자연수 n의 각 자리 숫자를 뒤집은 순서로 더해 출력하는 수식을 리턴해주세요. 예를들어 n이 12345이면 "5+4+3+2+1=15''라는 문자열을 리턴합니다.

 

제한 조건

N의 범위 : 100,000,000 이하의 자연수

 

입출력 예

n result
12345 "5+4+3+2+1=15"
1532576 "6+7+5+2+3+5+1=29"

 

지정 입력값

n result
718253 "3+5+2+8+1+7=26"

 

How I solved👇🏻

▶양 끝의 따옴표도 조건인지 아닌지 분간이 안가서(...) 그냥 적었다....ㅎ.........ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

function solution(n){
   let sum = '';
   let answer = 0;
   let nums = n.toString().split("").reverse();
   
   for( let i = 0 ; i < nums.length ; i++){
     sum += Number(nums[i]) + "+";
     var cut = sum.slice(0, -1);
   }
   
   for (let i = 0 ; i < nums.length ; i++){
     answer += Number(nums[i])
   }
   
     return '"' + cut + "=" + answer + '"';
 }
 
 console.log(solution(718253))
 //"3+5+2+8+1+7=26"

2번. 몇시간 했더라? (중)

지용이는 항해에서 한 주 동안 공부 기록을 남길 알고리즘을 만들어보기로 결심했다. 항해의 체크인 페이지에는 몇가지 조건이 있는데 이를 만족하는 알고리즘을 만들어보자.

- 체크인과 체크아웃은 항상 정시에 진행한 것으로 가정한다.

- 체크아웃을 할 때 익일 시간은 24+a 로 계산한다. 즉 새벽 2시는 24+2 인 26으로 표기한다.

- 체크인 페이지는 체크아웃이 새벽 5시 정각이나 새벽 5시를 넘어가면 체크아웃을 깜빡한 것으로 간주한다. 따라서 새벽 5시가 넘어가 체크아웃을 하게 되면 자동으로 체크아웃을 오후 9시(21시)로 한 것으로 처리한다.

- checkin과 checkout 배열의 길이는 각각 7 이다.

 

제한 조건

- 체크인(checkin)과 체크아웃(checkout)을 진행한 시간이 담긴 배열 두 개가 주어진다.

- 각 배열에는 월요일부터 일요일까지 체크인/아웃을 한 시간이 담겨있다.

 

입출력 예

checkin checkout result
[9, 9, 8, 8, 7, 8, 9]
[21, 25, 30, 29, 22, 23, 30]
96
[9, 7, 8, 9, 7, 9, 8]
[23, 22, 26, 26, 29, 27, 22]
110

 

지정 입력값

checkin checkout result
[9, 9, 9, 9, 7, 9, 8]
[23, 23, 30, 28, 30, 23, 23]
102

 

How I solved👇🏻

▶즨쯔.... 할 말이 많다.......... 

 

첫 시도⬇

function solution(arr1, arr2) {
    let timeGap = [];
    let sum = 0;

    for (i = 0; i < arr1.length; i++) {
        if (arr2[i] >= 29) {
            arr2[i] = 21;
            timeGap.push(arr2[i] - arr1[i]);
            let sum = sum + timeGap[i];
        }

        return sum;
    }
}

let arr1 = [9, 9, 9, 9, 7, 9, 8];
let arr2 = [23, 23, 30, 28, 30, 23, 23];

console.log(solution(arr1, arr2))
//0

➪First of all, 계속 답이 0이 나와서 미칠 것 같았다. 에러가 뜨면 떠야지, undefined가 뜨면 떠야지 0이 왠말이냐고......

시험 전에도, 중에도, 지금도 VSCode와 씨름중인데T T 걔는 디버깅도 잘 안돼서 코드를 하나하나 뜯어보기도 힘들었다.

➪0이 왜 나왔냐고? 그게... 디버깅해보니까 저러면 if 조건이 안맞는 그 순간!!!! 바로 return으로 빠져나가버림............

➪왜?!?! 왜냐면......... for문 안에 return을 적어줬자나...................ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ흫흫하핳하하ㅏ하ㅏ하하하ㅏ하ㅏ하ㅏㅏㅠㅠㅠㅠㅠㅠㅠㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ아오......................

 

두번째 시도⬇

function solution(arr1, arr2) {
    let timeGap = [];
    let sum = 0;

    for (i = 0; i < arr1.length; i++) {
        if (arr2[i] >= 29) {
            arr2[i] = 21;
            timeGap.push(arr2[i] - arr1[i]);
        } else {
            timeGap.push(arr2[i] - arr1[i]);
        }
    }
    for (i = 0; i < timeGap.length; i++) {
        sum += timeGap[i];
    }

    return sum;
}

let arr1 = [9, 9, 9, 9, 7, 9, 8];
let arr2 = [23, 23, 30, 28, 30, 23, 23];

console.log(solution(arr1, arr2))
//102

➪else를 적어주어 조건에 만족하지 않을때도 timeGap에 공부 시간을 push해주도록 만듦

➪if와 else를 모두 써주고 각각 행할 행동을 정확히 적어주니 답이 제대로 나옴. 근데 너무 지리멸렬해보임.

➪sum 앞에 let 왜 쓰면 안됨!?!!?!?! 그니까... let sum += timeGap[i]; 이렇게?!!?? 왜냐면... 이미 sum을 let으로 할당했는데, for문 안에서 let sum을 하는건 ... sum이란 애를 아예 계~!속 매~~~~!번 새로 호출하는 것....

 

세번째 시도⬇

function solution(arr1, arr2) {
    let timeGap = [];
    let sum = 0;

    for (i = 0; i < arr1.length; i++) {
        if (arr2[i] >= 29) {
            arr2[i] = 21;
        }
        timeGap.push(arr2[i] - arr1[i]);
    }

    for (i = 0; i < timeGap.length; i++) {
        sum += timeGap[i];
    }

    return sum;
}

let arr1 = [9, 9, 9, 9, 7, 9, 8];
let arr2 = [23, 23, 30, 28, 30, 23, 23];

console.log(solution(arr1, arr2))
//102

➪else를 어떻게하면 없애버릴지 생각해보았음.

➪일단 for문 안의 if문에서는 arr2[i] >= 29일 때 걔를 21로 바꿔주는 작업만 시킴

➪걔의 바로 밖, for문 나가기 전에 timdGap에 push해주도록 함

➪근데 또 의문인게... 얘는..... 저 if조건의 사실상 else에 해당하는 i가 들어오더라도 그냥 그대로 흘러버리지 않고 제대로 반복을 실행함. 그러면 첫번째는 왜 그랬던거지....? 왜 밖으로 그냥 흘러나왔지............? 모르겠어T T

➪암튼;; 그렇게 배열에 집어넣은 다음, for문을 한번 더 돌리면서 배열의 하나하나를 더하고 그 값을 return함

 

네번째 시도⬇

function solution(arr1, arr2) {
    let sum = 0;

    for (i = 0; i < arr1.length; i++) {
        if (arr2[i] >= 29) {
            arr2[i] = 21;
        }
        let timeGap = arr2[i] - arr1[i];
        sum += timeGap;
    }
    return sum;

}

let arr1 = [9, 9, 9, 9, 7, 9, 8];
let arr2 = [23, 23, 30, 28, 30, 23, 23];

console.log(solution(arr1, arr2))

➪어떻게든 최대한 볼륨을 줄여봄.

➪배열 안만듦. for문 본격 들어가기 전에 선언한 변수라고는 sum이 전부.

➪for문 돌면서 시간 조건 맞게 변경해주고,

➪for문 안에서 지역변수로 timeGap 선언하고 거기에 시간차 집어넣고,

➪sum에 그 시간차들을 더해서 넣어줌

➪그리고 걔를 리턴

 

 

➜변수 선언, if문 사용법 등을 아직 제대로 모름.....

➜문제 풀면서 마구 코드를 바꾸다보면 운 좋게 얻어걸리는(?)게 많아서, 그렇게 감 잡으면서 풀어왔는데...

➜이건 밑천이 금방 드러날 방법....T T 어디까지 깊게 제대로 공부해야 하는지 모르겠다ㅏㅏ


3번. 소수의 개수와 덧셈 (상)

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 소수의 최대값과 소수가 아닌 수의 최소값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.

예를들어 s가 "2 3 4 5"라면 "4 5"를 리턴하고, "15 3 10 9 7 8"라면 "8 7"을 리턴하면 됩니다.

 

제한 사항

- s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

- 문자열에는 소수가 한개 이상 섞여 있습니다.

- 문자열에는 소수가 아닌 수가 한개 이상 섞여 있습니다.

- 음수는 없습니다.

 

입출력 예

s result  
“2 3 4 5” "4 5"  
"15 3 10 9 7 8" "8 7"  

 

지정 입력값

n result
“97 75 88 99 95 92 73” "75 97"

 

How I solved👇🏻

푸는 중