221118 항해99 12일차 알고리즘 문제풀이

요니링 컴터 공부즁·2022년 11월 20일
0
  1. 2016년
function solution(a, b) {
    let day = ['THU', 'FRI', 'SAT', 'SUN', 'MON', 'TUE', 'WED'];
    let date = b + (a-1)*30;
    let count = 0;
    for (let i=1; i<=a; i++) {
        if (i === 3) {
            count--;
        } else if ((i <= 8 && i%2 === 0) || (i > 8 && i%2 === 1)) {
            count++;
        }
    }
    let answer = day[(date+count)%7];
    return answer;
}

계속 에러난 부분
: 날짜가 7로 나누어떨어졌을때 배열이 [-1]로 됐기 때문,, 자바스크립트에선 Python 같이 Array[-1]과 같은 접근 방식은 사용할 수 없다.

	let answer = day[(date+count)%7 - 1];
    return answer;
  1. 나누어 떨어지는 숫자 배열

배운 것

  • 배열에 element를 추가하려면 + 연산자를 쓰는게 아니라 push 메소드를 활용해야 함.
  • sort()는 문자열을 alphabetical, ascending order로 정렬한다. 숫자를 정렬하기 위해선 compareFunction(function(a, b){return a-b})을 파라미터로 넣어줘야 한다. 만약 b가 a보다 크다면 파라미터 값으로 음수가 넘어가서 두 값의 위치를 바꿔준다.
    function solution(arr, divisor) {
      let answer = [];

      for (let i = 0; i < arr.length; i++) {
        let a = Number(arr[i])
        let b = Number(divisor)
        if (a % b === 0) {
          answer.push(a)
        } 
      }
      if (answer.length === 0) {
        answer = [-1]
      }
    
      return answer.sort((a,b) => a-b);
    }
  1. 수박수박수박수박수박수?
function solution(n) {
    let answer = '';
    for (let i=1; i<=n; i++) {
        if (i%2 === 1) {
            answer += '수'
        } else if (i%2 === 0) {
            answer += '박'
        }
    }
    
    return answer;
}
  1. 완주하지 못한 선수
function solution(participant, completion) {
    let a = participant.sort()
    let b = completion.sort()
    for (let i=0; i<a.length; i++) {
        if (a[i] !== b[i]) {
            return a[i] 
        }
    }
}

내가 푼 답안
: sort 메소드를 활용하고 싶어서 이렇게 했는데, for loop을 두번이나 돌리니까 효율성도 떨어지고, 값 비교하는 부분에서 동명이인이 2명 이상일 경우 자꾸 테스트가 실패하는 것 같았다.

배운 것
: for loop 조건이 비슷해서 합치고 싶었는데, 두 배열을 모두 정렬하면 그 부분이 해결된다는 것을 발견했다. 그리고 indexOf 메소드를 배웠다. 배열의 인덱스을 파라미터로 넣으면 해당 인덱스의 값이 배열에 있는지 찾아주고, 있다면 같은 인덱스 번호를 반환하고 없다면 -1을 반환한다.

function solution(participant, completion) {
    let a = participant.sort()
    let b = completion
    let c = a[0]
    let answer
    for (let i=0; i<a.length; i++) {
        if (b.indexOf(a[i]) === -1) {
            answer = a[i] 
        }
    }
    if (answer === undefined) {
        for(let i=1; i<a.length; i++) {
            if(a[i] == c) {
                answer = c
            } 
            c = a[i]
        }
    }
    return answer;
}
  1. 이상한 문자 만들기

배운 것
: 처음엔 새로 값을 저장할 변수를 따로 안만들고 하나의 변수를 선언하고 거기에 값을 계속 다시 넣었는데, 그렇게 하니까 아예 실행이 안됐다. 새로운 값을 할당할 변수를 꼭 하나 더 만들어주기!

function solution(s) {
    let answer = '' 
    let z = s.split(' ')
    for (let i=0; i<z.length; i++) {
        for (let j=0; j<z[i].length; j++) {
            if (j%2 === 0) {
                answer += z[i][j].toUpperCase()
                continue
            } else {
                answer += z[i][j]
            } 
        } 
        if (i < z.length-1) {
           answer += ' ' 
        }
        
    }
    return answer;
}
  1. 자릿수 더하기
function solution(n) {
    let answer = 0
    let num = String(n)
        for (let i=0; i<num.length; i++) {
            answer += Number(num[i])
        }
    return answer;
}
  1. 자연수 뒤집어 배열로 만들기
function solution(n) {
    let answer = [];
    let num = String(n)
    for (let i=num.length-1; i>=0; i--) {
        answer.push(Number(num[i]))
    }
    return answer;
}
  1. 정수 내림차순으로 배치하기
function solution(n) {
    let b = []
    let num = String(n)
    let answer = ''
    for (let i=0; i<num.length; i++) {
        b.push(Number(num[i]))
    }
    b = b.sort().reverse()
    for (let i=0; i<b.length; i++) {
        answer += b[i]
    }

    return Number(answer)
}
  1. 정수 제곱근 판별
function solution(n) {
    let answer = 0;
    let num = n
    if (Math.sqrt(num)%1 === 0) {
        answer = (Math.sqrt(num)+1)**2
    } else {
        answer = -1
    }
    return answer;
}
  1. 제일 작은 수 제거하기

맞는 답안
: Math.min 함수를 많이 사용하던데 효율성 측면에서 이게 가장 빨라보였다.

function solution(arr) {
    if (arr.length === 1) 
    	return [-1];
    
    let i = 0;
    for (let j = 0; j < arr.length; j += 1) {
        if (arr[i] > arr[j]) 
        i = j;
    }
    arr.splice(i, 1);
    return arr;
}

나의 틀린 답
: sort 메소드를 또 써보고 싶었는데 어디서 꼬이는 것 같다.. 문제에서 배열이 descending order로 정렬되어 있어서 당연이 내림차순으로 정렬하는줄 알았는데 그런 말은 없었기 때문에 답안 자체의 배열 순서를 바꿔서는 안됐다. 그래서 다른 변수에 할당해서 index만 찾고 싶었는데,, 문법 공부랑 CS 지식 좀 쌓아야겠다 뭐가 어디서 꼬이는지도 알수가 힘들군

function solution(arr) {
    let answer = arr
    let index
    let sorting = arr
    let min
    if (answer.length === 1) {
        answer = [-1]
    } else {
            sorting.sort(function(a, b){return b-a})
            index = sorting[sorting.length-1]
            min = answer.indexOf(index)
            answer.splice(min, 1)
    }
    return answer
}

=> 알고리즘 문제풀이 재밌다,, 고수들 모범 답안 보면서 많이 배워야겠다!!

0개의 댓글