본문 바로가기
Algorithm

[인프런 강의] JS 알고리즘 문제풀이(코딩테스트 대비) - 섹션1

by Baest 2022. 1. 30.

 

*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));