ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션1
    Algorithm 2022. 1. 30. 21:17

     

    *17개 문제 중 3개 못 풀었음 (22.01.31)

     

     

    1) 세 수 중 최솟값

     function solution(a, b, c) {
        let answer;
        if (a < b) {
            answer = a;
        } else {
            answer = b;
        }             
        if (answer > c) {
            answer = c;
        }
        return answer;
    }
    
    console.log(solution(2, 5, 1));

     

    2) 삼각형 판별하기

    * 가장 긴 변의 길이가 다른 두 변의 길이의 합보다 크거나 같으면 삼각형을 그릴 수 없다. 

    세 변의 길이를 줬을 경우 길이가 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 삼각형을 그릴 수 있다.

    function solution(a, b, c) {
        let answer = "YES";
        let arr = [a, b, c];
    
        arr.sort(function(a,b) {
            return a-b;
        });
    
        const max = arr[2];
        if(arr[0] + arr[1] <= max) {
            answer = "NO";
        }          
        return answer;
    }
    console.log(solution(13, 33, 17));

     

    * 강사님 코드

     function solution(a, b, c) {
        let answer = "YES"; max;
        let sum=a+b+c;
        if(a>b) max=a;
        else max=b;
        if(c>max) max=c;
        if((sum-max)<=max) answer="NO";
        return answer;
    }
    console.log(solution(13, 33, 17));

     

    3) 연필개수

    * 나머지가 있을 경우 올림 해줘야함

     function solution(n) {
        let answer;
        answer = Math.ceil(n / 12);
        return answer;
    }
    
    console.log(solution(178));

    👉 let answer = Math.ceil(n/12);   한 줄로 작성 가능

     

     

    4) 1부터 N까지의 합

    function solution(n) {
        let answer = 0;
        for(let i=1; i <= n; i++) {
            answer += i
        }
        return answer;
    }
    console.log(solution(10));

     

     

    5) 최솟값 구하기

    * 아래와 같이 오름차순 정렬해서 arr의 0번째 있는 수를 return 했는데, 출제자의 의도가 이 방식은 아니라고 생각.

    방법2와 같이 다시 풀었음.

     

    방법1

     function solution(arr) {
        arr.sort( function (a,b) {
            return a-b;
        });
        return arr[0];
    }
    let arr = [5, 7, 1, 3, 2, 9, 11];
    console.log(solution(arr));

    방법2

     function solution(arr) {
        let answer;
        let min = arr[0]; // arr의 0번째 인덱스 값으로 세팅
        for(let i=0; i < arr.length; i++) {
           if(arr[i] < min) {
               min = arr[i];
           }
        }
        return min;
    }
    let arr = [5, 7, 1, 3, 2, 9, 11];
    console.log(solution(arr));

     

    * 강사님 코드

    function solution(arr) {
        let answer;
        let min = Number.MAX_SAFE_INTEGER; // 안전한 범위의 제일 큰 정수로 초기화 
        for(let i=0; i < arr.length; i++) {
           if(arr[i] < min) {
               min = arr[i];
           }
        }
        return min;
    }
    let arr = [5, 7, 1, 3, 2, 9, 11];
    console.log(solution(arr));

     

    * 보충

    [Math.min() 함수 사용해서 최솟값 구하기]

    Math.min(1,7,3) 

    배열일 경우 Math.min(...arr) 

    -> ...arr 하는 이유는 arr[0], arr[1], arr[2]... 와 같이 인자를 전개 연산자를 사용해서 펼쳐줘야함

     

    전개연산자를 쓰지 않으려면

    Math.min.apply(null, arr); // 첫번째 인자는 객체고 null, 두번째 인자에 배열을 넘김

     

    [Math.max() 함수 사용해서 최댓값 구하기]

    Math.min(1,7,3) 

    배열일 경우 Math.max(...arr) 

     

     

    6) 홀수

    * 배열 중 홀수의 합을 첫째 줄에 출력, 해당 홀수 중 최솟값을 둘째 줄에 출력

    function solution(arr) {
        let answer = [];
        let sum = 0;
        for(let i=0; i < arr.length; i++) {
            if(arr[i] % 2 !== 0) { // 홀수 판별
                 sum += arr[i];
                answer.push(arr[i]);
            }
        }
        answer.sort(function (a,b) { // 정렬
            return a-b;
        });
        console.log(sum) // 합계 출력
        return answer[0];// 최솟값 출력
    }
    
    arr = [12, 77, 38, 41, 53, 92, 85];
    console.log(solution(arr));

     

    function solution(arr) {
        let answer = [];
        let sum = 0;
        let min = Number.MAX_SAFE_INTEGER; // 안전 범위의 가장 큰 숫자로 초기화
    
        for(let x of arr) {
            if(x % 2 === 1) { // 홀수일 경우 합산
                sum += x;
                if(x < min) { // 최솟값 구함
                    min = x;
                }
            }
        }
        answer.push(sum);
        answer.push(min);
    
        return answer;
    }
    
    arr = [12, 77, 38, 41, 53, 92, 85];
    console.log(solution(arr));

     

     

    7) 10부제

     function solution(day, arr) {
        let answer = 0;
        for(let i=0; i < arr.length; i++) {
            if(arr[i].toString().split("")[1] == "3") // 문자열로 바꾸고 split 후 1번째 인덱스 비교
                answer++;
        }
        return answer;
    }
    arr = [25, 23, 11, 47, 53, 17, 33];
    console.log(solution(3, arr));

     

    * 강사님 코드

     function solution(day, arr) {
        let answer = 0;
        for(let x of arr) {
            if(x % 10 === day) { // 10으로 나눈 나머지가 day일 때
                answer++;
            }
        }
        return answer;
    }
    arr = [25, 23, 11, 47, 53, 17, 33];
    console.log(solution(3, arr));

     

     

    8) 일곱난쟁이

    *실패 코드

    function solution(arr) {
       let answer = arr;
       let sum =0;
       for(let i = 0; i < arr.length; i++) {
            sum += arr[i];
            console.log("sum: " + sum)
            for(let j = 0; j < arr.length; j++) {
                if(sum - (arr[i] + arr[j]) == 100) {
                     arr.splice(i, 1);
                     arr.splice(j, 1);
                }
    
            }
    
        }
        return answer;
    }
    
    let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
    console.log(solution(arr));

     

    *강사님 코드

    function solution(arr) {
        let answer = arr; // 얕은 복사 (메모리에 있는 똑같은 주소 가리킴)
        let sum = arr.reduce((a, b) => a + b, 0); // a에 b(arr의 값들)를 누적, 0은 처음에 0으로 초기화(시작 조건 없을 경우 안해도 됨)
        console.log(sum);
        for(let i = 0; i < 8; i++) { // 배열에서 2개씩 확인하니까 9보다 하나 작은 8로,,
            for(let j = i+1; j < 9; j++) { // 9 대신 arr.length로 하면 됨
                // console.log(arr[i], arr[j]);
                if(sum - (arr[i] + arr[j]) === 100) {
                    arr.splice(j, 1); // i를 먼저 지울 경우 앞에서 삭제되며 뒤 인덱스가 변경
                    arr.splice(i, 1); // 때문에 뒤 인덱스인 j부터 지우고 i를 지움
                }
            }
        }
        return answer;
    }
    let arr = [20, 7, 23, 19, 10, 15, 25, 8, 13];
    console.log(solution(arr));

     

     

     

    9) A를 #으로

    function solution(s) {
        let answer = s.replace(/\A/g, "#"); // A 를 # 으로 변경
        return answer;
    }
    let str = "BANANA";
    console.log(solution(str));

     

    *강사님 코드

    function solution(s) {
        let answer = "";
        for(let x of s)
            if(x === "A")
                answer += "#";
            else 
                answer += x;
        return answer;
    }
    let str = "BANANA";
    console.log(solution(str));

     

     

    10) 문자 찾기

    function solution(s, t) {
        let answer = 0;
        for(let i = 0; i < s.length; i++) {
            if(s[i] === t)
                answer++;
        }
        return answer;
    }
    let str = "COMPUTERPROGRAMMING";
    console.log(solution(str, 'R'));

     

    *강사님 코드

    function solution(s, t) {
        let answer = 0;
        for (let x of s) {
            if (x === t) answer++;
        }
        return answer;
    }
    
    let str = "COMPUTERPROGRAMMING";
    console.log(solution(str, 'R'));

     

    function solution(s, t) {
        let answer = s.split(t).length; // 만약 t가 제일 끝에 있어도 빈 문자열이 생기기 때문에 관계 없음
        return answer - 1;
    }
    
    let str = "COMPUTERPROGRAMMING";
    console.log(solution(str, 'R'));

     

    문자열 찾기 출력

     

     

    11) 대문자 찾기

    *내가 풀이한 것 중 if 문으로 처리한 부분에서 소문자가 97부터 시작하지만 알고보니 대문자에서 바로 소문자로 간게 아니라 91부터 96까지 다른 특수문자가 있었다.

    따라서 해당 코드에서 65 에서 90 사이일 경우로 조건을 변경이 필요하다.

    function solution(s) {
        let answer = 0;
        let arr = s.split("");
        for(let i=0; i < s.length; i++) {
            if(arr[i].charCodeAt() < 97 ) // 소문자 a (97)보다 작을 경우 answer ++
                answer++;
        }
        return answer;
    }
    let str = "KoreaTimeGood";
    console.log(solution(str));

     

    function solution(s) {
        let answer = 0;
        for (let x of s) {
            //let num=x.charCodeAt();
            //if(num>=65 && num<=90) answer++;
            if (x === x.toUpperCase()) answer++;
        }
    
        return answer;
    }
    
    let str = "KoreaTimeGood";
    console.log(solution(str));

     

     

    12) 대문자로 통일

     function solution(s) {
        let answer = "";
        let arr = s.split("");
        for (let i=0; i < s.length; i++) 
            if (arr[i].charCodeAt() > 96) // 아스키 코드로 소문자일 경우 
                answer += arr[i].toUpperCase(); // 대문자로 변환
            else
                answer += arr[i];                                   
        return answer;
    }
    let str = "ItisTimeToStudy";
    console.log(solution(str));

     

    *강사님 코드

    function solution(s) {
        let answer = "";
        for (let x of s) {
            let num = x.charCodeAt();
            if (num >= 97 && num <= 122) 
                answer += String.fromCharCode(num - 32); // 소문자 아스키 코드에서 32 빼면 대문자 아스키 코드 나옴
            else 
                answer += x;
            //if(x===x.toLowerCase()) answer+=x.toUpperCase();
            //else answer+=x;
        }
        return answer;
    }
    let str = "ItisTimeToStudy";
    console.log(solution(str));

     

    - 쉬운 방법

    function solution(s) {
        let answer = s.toUpperCase();  // 여기서 한 번에 대문자로 바뀜
        return answer;
    }
    console.log(solution("StuDY"));

     

     

    13) 대소문자 변환

    function solution(s) {
        let answer = "";
        let arr = s.split("");
        for(let i=0; i < s.length; i++) 
            if(arr[i].charCodeAt() > 96) // 소문자일 경우
                answer += arr[i].toUpperCase(); // 대문자로 변경
            else // 대문자일 경우
                answer += arr[i].toLowerCase(); // 소문자로 변경
        return answer;
    }
    console.log(solution("StuDY"));

     

    *강사님 코드

     function solution(s) {
        let answer = ""; 
        for(let x of s) {
            if (x === x.toUpperCase())
                answer += x.toLowerCase();
            else
                answer += x.toUpperCase();
        } 
        return answer;
    }
    console.log(solution("StuDY"));

     

     

     

     

    14) 가장 긴 문자열

     

    *풀지 못한 코드

    function solution(s) {
        let answer = ""
        let max = Number.MIN_SAFE_INTEGER;
        for(let i = 0; i < s.length; i++) {
            if(s[i].length > max) 
                max = s[i].length;
                answer = s[i]; // 여기서 계속 s의 새로운 단어들이 들어오는 문제 (max가 이미 큰 값으로 세팅되어 있으므로)
        }
        return answer;
    }
    let str = ["teacher", "time", "student", "beautiful", "good"];
    console.log(solution(str));

     

    *위의 코드에서 if 문에 { } 를 넣어주니까 정상적으로 beautiful이 출력됐다....

    function solution(s) {
        let answer = ""
        let max = Number.MIN_SAFE_INTEGER;
        for (let i = 0; i < s.length; i++) {
            if (s[i].length > max) {
                max = s[i].length;
                answer = s[i];
            }
        }
        return answer;
    }
    let str = ["teacher", "time", "student", "beautiful", "good"];
    console.log(solution(str));

     

     

    * 강사님 코드

    function solution(s) {
        let answer = "", max = Number.MIN_SAFE_INTEGER;
        for (let x of s) {
            if (x.length > max) {
                max = x.length;
                answer = x;
            }
        }
        return answer;
    }
    let str = ["teacher", "time", "student", "beautiful", "good"];
    console.log(solution(str));

     

     

     

    15) 가운데 문자 출력 

    function solution(s) {
        let answer = "";
        let mid = Math.floor(s.length / 2) ; 
        if (s.length % 2 === 0) 
            answer += s[mid - 1] + s[mid];      
        else if (s.length % 2 === 1) 
            answer += s[mid]    
        return answer;
    }
    console.log(solution("study"));

     

    function solution(s) {
        let answer;
        let mid = Math.floor(s.length / 2)
        if (s.length % 2 === 1) answer = s.substring(mid, mid + 1); 
        else answer = s.substring(mid - 1, mid + 1); // substring(2,3) 2번 인덱스에서 3번 인덱스 전까지라는 뜻. 즉, 2번 인덱스만.
        //if(s.length%2===1) answer=s.substr(mid, 1);
        //else answer=s.substr(mid-1, 2); // substr(2,4) 2번 인덱스에서 4개를 뽑아내라
        return answer;
    }
    console.log(solution("study"));

     

     

     

    16) 중복문자 제거

    * arr.indexOf(v) === i 이 부분 덜 이해됨 다시 확인해야함

    function solution(s) {
        let answer = "";
        let arr = s.split("");
        let arrUniqe = arr.filter((v, i) => {
            if(arr.indexOf(v) === i) // 해당 값의 첫 인덱스와 마지막 인덱스가 같을 경우
                answer += arr[i];
        });
        return answer;
    }
    console.log(solution("ksekkset"));

     

    중복문자 제거 출력

    알파벳 다음으로 나온 두 인덱스가 다를 경우 제거 (중복이라는 뜻)

     

    *강사님 코드

    function solution(s) {
        let answer = "";
        //console.log(s.indexOf("K"));
        for (let i = 0; i < s.length; i++) {
            //console.log(s[i], i, s.indexOf(s[i]));
            if (s.indexOf(s[i]) === i) // s.indexOf(s[i]) 는 해당 알파벳의 idx 중복일 경우 제일 처음 idx 나옴
                answer += s[i];
        }
        return answer;
    }
    console.log(solution("ksekkset"));

     

    * 중복횟수를 찾아야하는 경우

    // 중복 횟수를 찾아야하는 경우
    function solution(s) {
        let answer = 0;
        let pos = s.indexOf("k"); // k의 첫번째 위치
        while(pos !== -1) { // 못 찾을 경우 -1  => 여기 제대로 이해 못함!!!
            answer++;
            pos = s.indexOf("k", pos+1); // 찾은 k의 위치 뒷편부터 탐색
        }
        return answer;
    }
    console.log(solution("ksekkset"));

     

     

     

    17) 중복단어 제거

     

     

    *강사님 코드

    function solution(s) {
        let answer;
        answer = s.filter((v, i) => {
            if (s.indexOf(v) === i) {
                return true; // true 가 return 되는 요소만 따로 뽑아서 새로운 배열 만든다.
            }
        });
        return answer;
    }
    let str = ["good", "time", "good", "time", "student"];
    console.log(solution(str));

     

    -> 위 코드블럭에서 if 문을 return 에 넣어 줄일 수 있음

    function solution(s) {
        let answer;
        answer = s.filter((v, i) => {
            return s.indexOf(v) === i; // true일 경우 해당 요소만 따로 뽑아서 새로운 배열 만든다.      
        });
        return answer;
    }
    let str = ["good", "time", "good", "time", "student"];
    console.log(solution(str));

     

    댓글

Designed by Tistory.