[TIL] 항해99 8기 10일차

lezsuuu·2022년 7월 20일
0

TIL

목록 보기
9/42
한 시간쯤 걸리겠다~! = 여섯 시간 걸림

프로그래머스 코딩테스트 연습 Level1

정수 제곱근 판별

function solution1(n) {
    
    answer = 0

    if (Math.sqrt(n) % 1 ==0) {
        answer = Math.pow(Math.sqrt(n) + 1,2)
    } else {
        answer = -1
    }

    return answer;
}

→ √n 을 1로 나눴을 때 0이 나오면 정수의 제곱근인 것으로 판별

제일 작은 수 제거하기

function solution2(arr) {
    let answer = []
    
    if (arr.length < 2) {
        answer = [-1]
    } else {
        answer = arr.sort((a,b) => a-b).splice(1)
    }
    return answer
}

→ 리스트의 길이가 2 미만이면 -1 출력
→ 오름차순으로 정렬하여 맨 앞 숫자 빼기

arr.sort((a,b) => a-b)

파라미터(compareFunction)가 입력되지 않으면, 유니코드 순서에 따라서 값을 정렬. Shllow Copy 주의. (오름차순으로 정렬하는 상황)

콜라츠 추측

function solution3(num) {
    let answer = 0
    for (let i=0; i<500; i++){
        if (num!==1) {
            num = num % 2 == 0 ? num / 2 : num * 3 + 1
        } else {
            return answer = i
        }   
    }
    return answer = -1
}

→ if문으로 짝수와 홀수를 구별
n !==1 반복문으로 최대 500회 돌리기 feat. 삼항연산자
n==1 i 출력
→ 500회가 넘으면 -1 출력

return 위치에 유의하기

수박수박수박수박수박수?

function solution4(n) {
    let answer = ''
    if (n%2==0) {
        answer = '수박'.repeat(n/2)
    } else {
        answer = '수박'.repeat((n-1)/2) + '수'
    }
    return answer
}

→ n이 짝수면 n/2만큼 '수박'찍기
→ n이 홀수면 (수박+'수') (n-1)/2만큼 '수박'찍고 + '수'

코드를 더 짧게 짜는 연습이 필요하다.

완주하지 못한 선수

function solution5(participant, completion) {
    participant.sort()
    completion.sort()
    for(let i=0; i<participant.length; i++){
        if(participant[i] !== completion[i]){
            return participant[i]
        }
    }
}

→ 두 array 를 같은 배열로 정렬하고
→ 같은 순서에 있는 인덱스를 비교하는데
→ 일치하지 않는 인덱스가 있다면 출력

이상한 문자 만들기

function solution6(s) {
    let answer = []
    let words = s.split(' ')
    for (let i=0; i<words.length; i++){
        answer.push(words[i].split('').map((cur, j)=>j%2?cur.toLowerCase():cur.toUpperCase()).join(''))
    }
    
    return answer.join(' ')
}

split으로 글자를 쪼개서(단어로 분리)
→ 쪼개진 인덱스를 반복문으로 돌리며
→ 다시 split으로 글자를 쪼개서(알파벳으로 분리)
map을 이용해 대문자 소문자로 돌아가며 바꾸고
→ 다시 단어로 붙여서 answerpush
→ 출력하기 전 한 문장으로 다시 answer.join(' ')

답안을 보고 푼 문제였는데(사실 대부분이 그렇다) 코드가 넘 길어져서 오히려 가독성이 떨어진 경우.

Map

모든 요소 각각에 대하여 주어진 함수를 호출한 결과를 모아 새로운 배열을 반환

const array1 = [1, 4, 9, 16];   
const map1 = array1.map(x => x * 2);        // pass a function to map
console.log(map1);
// expected output: Array [2, 8, 18, 32]

자릿수 더하기

function solution7(n){
    let answer = 0
    let nums = []
    do {
        nums.push(n%10)
        n = Math.floor(n/10)
    } while (n>0)
    return nums.reduce((acc, curr) => acc + curr)
}

(→ 숫자를 글자로 변환할 수도 있었지만)
do...while로 좀 특이한 풀이(를 보고 풀었다)
→ 숫자↔텍스트 변환을 반복하지 않아도 되는 간단한 방법이라 익혀두면 좋을 것 같다!

자연수 뒤집어 배열로 만들기

function solution8(n){
    let answer = 0
    let nums = []
    do {
        nums.push(n%10)
        n = Math.floor(n/10)
    } while (n>0)
    return nums
}

→ 어쩌다 보니 이전 문제와 로직이 겹쳐서 걍 푼 문제...

정수 내림차순으로 배치하기

function solution9(n){
    let answer = 0
    let nums = []
    do {
        nums.push(n%10)
        n = Math.floor(n/10)
    } while (n>0)
    answer = nums.sort((a,b) => b-a).join('')
    return Number(answer)
}

→ 음 분명히 문제 없었는데 TIL 쓰면서 vsc 돌리니까 false 가 나온다... → n부터 false가 뜨는데... 같은 코드 사용한 위에는 문제가 없는데...😭
또 내가 뭘 잘못한 거니

아래 문제에서 함수명이 겹쳐있었다😗

→ 다시 본론으로, 똑같이 숫자를 뽑고
sort로 이번에는 내림차순으로 출력한다

변수는 꼼꼼하게 관리하자

하샤드 수

function solution10(x) {
    let sum = 0;
    let arr = String(x).split('');
    for(let i=0; i<arr.length; i++) {
        sum += Number(arr[i]);
    }
    return (x % sum == 0) ? true : false;
}

→ 숫자를 문자로 바꾸어 split으로 쪼개준 후
→ for문으로 나눠진 인덱스의 총합을 구한다
→ 인덱스의 총합을 x 로 나누어 나머지를 확인하여 true 또는 false 출력

function solution11(x){
    return !(x % (x + "").split("").reduce((a, b) => +b + +a ));
}

→ 같은 문제인데 다른 풀이

내장함수 더더더 많이 공부하기

전화번호 정리하기

function sol12(num){
	
    let answer = ''
    // console.log(num.split(''))
    a = num.split('').splice(0,2).join('')
    b = num.split('').splice(2,4).join('')
    c = num.split('').splice(6,8).join('')

    // console.log(a)
    // console.log(b)
    // console.log(c)

    answer = '0' + a + '-' + b + '-' + c    
    return answer

}

→ 앞에 무조건 0을 붙여야 하고
→ 위치에 맞추어 '-' 을 추가하기
→ 두 조건은 answer에서 간단하게 처리하고
→ 임의로 들어온 숫자를 쪼개고 / 필요한 부분만 추려서 / 다시 붙인다
→ 그리고 제자리에 다시 붙이면 끝!

같은 숫자는 싫어

function sol13(num){
   let answer = []

    for(let i=0; i<arr.length; i++) {
        if (arr[i] !== arr[i+1]) {
            answer.push(arr[i])
        }
    }
    return answer
}

→ for문을 돌려서
→ 인덱스와 그 다음 인덱스를 비교해
→ 같으면 버리고 다르면 push해서 새로운 배열을 만들기

profile
돌고 돌아 벨로그

0개의 댓글