자바스크립트 알고리즘 문제풀이(01 ~ 22번)

  1. 세 수 중 최소값
    1
    2
    3
    4
    5
    6
    7
    const minimum_number = (a, b, c) => {
    let answer;
    if(a < b) answer = a;
    else answer = b;
    if (c < answer) answer = c;
    return answer
    }
  2. 삼각형 판별하기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const isTriangle = (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) return answer = "NO"
    else return answer
    }
  3. 연필 수 구하기
    1
    2
    3
    const pencil_number = n => {
    return Math.ceil(n/12)
    }
  4. 1부터 N까지의 합
    1
    2
    3
    4
    5
    6
    7
    const sum = (n) => {
    let answer = 0;
    for (let i = 1; i <= n; i++){
    answer += i;
    }
    return answer
    }
  5. 최소값 구하기
    1
    2
    3
    const minVal = arr => {
    return Math.min(...arr);
    }
  6. 수 더하기: filter함수와 reduce함수를 사용하여 구하기
    1
    2
    3
    const oddSum = arr => {
    return arr.filter(n => n%2 != 0).reduce((acc, cur) => acc+cur, 0)
    }
  7. 10부제
    1
    2
    3
    const carSelect = (day, arr) => {
    return arr.filter(carNum => carNum%10 === day).length
    }
  8. 일곱난쟁이
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    // 단순 정렬
    const sortHeight = arr => {
    let height = [...arr];
    for (let i = 0; i < arr.length; i++) {
    for (let j = i+1; j < arr.length; j++){
    let temp = 0;
    if (height[i] > height[j]) {
    temp = height[j]
    height[j] = height[i]
    height[i] = temp
    }
    }
    }
    return height.slice(0,7);
    }

    // 합병정렬 하기
    const sortHeight = arr => {
    // 1. 탈출구문을 만들기 (arr을 더이상 쪼갤 수 없을 때 탈출)
    if(arr.length === 1) return arr;

    // 2. 배열을 둘 로 쪼개기 Divide
    let mid = Math.floor(arr.length/2);
    let leftside = arr. splice(0, mid);

    // 3. 각각 합병하기 Conqure
    return merge(sortHeight(leftside), sortHeight(arr)).slice(0,7)
    // 문제는 키가 작은 일곱명을 선출하는 것
    }

    function merge(left, right) {
    // 정리용 빈 배열을 만들기
    let result = [];
    // 각 배열에서 원소를 꺼낼 것이기 때문에 두 배열이 전부 빈 배열이 되면 끝나도록 while문으로 반복
    while (left.length !== 0 && right.length !== 0) {
    // 두 배열의 첫번째 인자를 비교하여 오른쪽이 더 크거나 같다면 작은 수인 왼쪽 배열의 수를 꺼내 정리용 배열에 푸쉬
    left[0] <= right[0] ? result.push(left.shift()) : result.push(right.shift());
    }
    // spreading operator로 result 배열과 나머지 배열 값들을 담아 리턴
    return [...result, ...left, ...right];
    }


    // ES2015 문법을 사용하여 정렬하여 잘라내기
    const sortHeight2 = arr => {
    return arr.sort((a,b) => a-b).slice(0,7)
    }
  9. A를 #으로 변경하기 (문자열 다루기)
    1
    2
    3
    4
    5
    const changeChar = str => {
    return str.split('')
    .map(char => (char === "A") ? char = "#" : char )
    .join("")
    }
  10. 문자 찾기
    1
    2
    3
    const searchChar = (str, char) => {
    return str.split("").filter(each => each === char).length;
    }
  11. 대문자 찾기
    1
    2
    3
    4
    const searchCaptial = str => {
    return str.split("")
    .filter(each => each === each.toUpperCase()).length
    }
  12. 대문자로 통일하기
    1
    2
    3
    const changeCapital = str => {
    return str.split("").map(el => el.toUpperCase()).join("")
    }
  13. 가장 긴 문자열 찾기
    1
    2
    3
    const  searchLongestStr = strArr => {
    return strArr.sort((a,b) => b.length - a.length)[0]
    }
  14. 가운데 문자열 출력하기
    1
    2
    3
    4
    5
    6
    const middleChar = str => {
    let len = str.length;
    return (len%2 === 0)
    ? str.split("").slice((len/2)-1, Math.floor(len/2)+1).join("")
    : str.split("").slice((len/2), Math.floor(len/2)+1)[0]
    }
  15. 중복된 문자 제거: Set으로 중복을 제거하고 spread operator를 사용
    1
    2
    3
    4
    const deduplication = str => {
    let split = str.split('');
    return [...new Set(split)].join('')
    }
  16. 배열 내 중복된 단어 제거
    1
    2
    3
    const deduplicationArr = arr => {
    return [...new Set(arr)]
    }
  17. 큰 수 출력하기
    1
    2
    3
    const largerThen = (n, arr) => {
    return arr.filter(el => el > n)
    }
  18. 보이는 학생
    1
    2
    3
    4
    5
    6
    7
    8
    const visibleStudent = arr => {
    let standard = arr[0];
    let count = 1; // 첫번째 사람은 무조건 보이므로 1로 시작
    for(let student of arr) {
    if (student > standard) count++
    }
    return count;
    }
  19. 가위 바위 보
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const rsp = (n, A, B) => {
    let winner = [];
    for (let i = 0; i < n; i++) {
    if (A[i] === 1 && B[i] === 3) {
    winner.push("A")
    } else if (A[i] === 2 && B[i] === 1) {
    winner.push("A")
    } else if (A[i] === 3 && B[i] === 2) {
    winner.push("A")
    } else {
    winner.push("B")
    }
    }
    return winner;
    }
  20. 점수 계산
    1
    2
    3
    4
    5
    6
    7
    const scoring = (ox, score) => {
    let sum = 0;
    for (let i = 0; i < score.length; i++){
    ox[i] === 1 ? sum += score[i] : sum
    }
    return sum;
    }
  21. 등 수 구하기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const lank = (n, scores) => {
    let lank = Array.from({length:n}, () => 1)
    for(let i = 0; i< n; i++){
    for(let j = 0; j < n; j++){
    if (scores[j] > scores[i]) lank[i]++;
    }
    }
    return lank;
    }

    // 처음에는 내림차순으로 정렬해서 index값을 구하고자 했는데 같은 값이 들어오면 같은 등수로 처리해야 한다는 것을 간과함
  22. 격자판 내 가장 큰 합 구하기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    let gridArr = [
    [10, 13, 10, 12, 15],
    [12, 39, 30, 23, 11],
    [11, 25, 50, 53, 15],
    [19, 27, 29, 37, 27],
    [19, 13, 30, 13, 10]
    ]

    const maxSumInGrid = gridArr => {
    let rowSum = gridArr.map(row => row.reduce((acc, cur) => acc+cur, 0))
    let culSum = [];
    for (let i = 0; i < gridArr.length; i++) {
    let sum = 0;
    for (let j = 0; j < gridArr.length; j++){
    sum += gridArr[j][i];
    }
    culSum.push(sum);
    }
    let downSum = upSum = 0
    for (let i = 0; i < gridArr.length; i++){
    downSum += gridArr[i][i];
    upSum += gridArr[i][gridArr.length-i-1]
    }
    let crossSum = [downSum, upSum]

    return Math.max(...rowSum, ...culSum, ...crossSum)
    }

    기초 문제 풀며 느낀 점

  • 이차원 배열을 다룰 때 map과 reduce를 어떻게 하면 잘 사용할 수 있을지 공부하기
  • if/else문을 사용하여 분기점을 여러개 만드는 걸 꺼리고 있는데 brute-force방식으로도 문제를 풀어보기