728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12899

 

코딩테스트 연습 - 124 나라의 숫자

 

programmers.co.kr

 

코드


function solution(n) {
    let answer = '';

    while (n > 0) { //n이 0이 아닐때까지 반복
        switch (n % 3) { //3으로 나눈 나머지가 각각 0,1,2인 경우에
            case 1:
                answer = "1" + answer; //10진수가 10인경우에는 맨처음 answer = '1' 그다음 switch문 돌면 answer = '4' + answer = '4'+'1' = '41'
                n = Math.floor(n / 3);
                break;
            case 2:
                answer = "2" + answer;
                n = Math.floor(n / 3);
                break;
            case 0:
                answer = "4" + answer;
                n = n/3 - 1; //3으로 나눈 나머지가 0인 경우에(case 0)만 3으로나눈몫에 -1을 해줌
                break;
        }
    }

    return answer;
}

 

후기


  • 직접 작성해본 변환표이다. 제일 처음 찾은 규칙은 각 10진수를 3으로 나눈 나머지가 1일 때는 1로 변환, 2일 때는 2로 변환, 0일 때는 4로 변환되는 것을 알 수 있었다. 그리고 찾은 두 번째 규칙으로는, 나머지가 0일 때 즉, 10진수가 3의 배수일 때만 몫에 어딘가 규칙이 어긋난 것 같은 느낌을 받았다. 10진수가 각각 3, 6, 9일 때, 몫이 0, 1, 2여야 규칙이 완성될 것 같았다
  •  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 그러므로 3으로 나눈 나머지가 1, 2인 경우(case 1, 2)에는 몫을 그대로 구하면 되지만, 나머지가 0인 경우(case 0)에는 3으로 나눈 몫에 -1을 해줘야 한다. 그렇게 해서 구한 n은 다시 while 문을 돌며 0이 아닐 때까지 반복하여 124숫자를 완성하게 된다 
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42586

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

코드


function solution(progresses, speeds) {
    let answer = [];
    let day = []; //앞으로 남은 진행일 저장하는 배열
    let count = 1; //한 번의 배포에 몇개의 기능이 배포되는지 count하는 변수 (최소 1개는 배포되는 것이니 초기값 1)
    let max = 0; //한번에 배포될 기능들 중 진행일이 가장 길게 남은 일수를 저장할 변수
    let len = progresses.length; //=speeds.length

    for (let i=0; i<len; i++) {
        day.push(Math.ceil((100-progresses[i])/speeds[i])); //올림함수 Math.ceil()을 통해 각각의 남은 진행일을 day에 push
    }

    for (let i=0; i<len; i++) {
        max = day[i]; //남은 진행일 중 최대값 담아놓기
        while (max > day[i+1] || max === day[i+1]) { //최대 진행일을 가진 기능보다 그 바로 다음 기능의 진행일이 적은 경우나 최대 진행일과 같은 경우에는
            count++; //한번에 배포할 기능 +1
            i++;
        }
        answer.push(count);
        count = 1; //다시 초기화
    }
    return answer;
}

 

후기


  • 처음 문제를 접근할 때, progresses, speeds 개수만큼 for문을 돌리고, 각 원소의 수에 따라 남은 진행일을 배열에 저장하여, 그 배열을 이용하여 답을 도출하자는 아이디어를 떠올렸다
  • 그러기 위해서 제일먼저 진행일을 구해야했고, " (100-progresses[i])/speeds[i] " 코드를 떠올렸다. 이 코드는 소수점이 나올 경우도 있기 때문에 이를 해결하기 위해서는 반올림도 반내림도 아닌 그냥 올림을 하는 함수를 이용해야 했다. 다행히 자바스크립트에는 Math 객체에 ceil() 이라는 올림함수가 있었고, 이를 이용하여 쉽게 남은 진행일을 구할 수 있었다
  • 맨 처음 풀 때는 max라는 변수를 사용하지 않고 풀었는데, 그랬더니 기본 테스트 케이스2번에서 오류가 발생했다. 해당 테케에서 남은 진행일이 [5, 10, 1, 1, 20, 1] 로 나왔는데, index 4번째에서 while문을 빠져나갔기 때문이다
  • 이를 해결하고 나서 기본 테케를 모두 맞춘 후에 제출을 하였는데 자꾸 히든 테스트케이스 1, 2, 4, 5번에서 오류가 생겼다. 이를 해결하기 위해서는 progresses = [99, 99, 99], speeds = [1, 1, 1] 의 경우를 생각하였더니 해결할 수 있었다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/42862?language=javascript 

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

 

코드


  • 나의 코드
function solution(n, lost, reserve) {
    let answer = 0;
    let stu = Array.from({length:n}, ()=>1); //n개의 길이의 배열에 1로 초기화

    for(let i=1; i<=n; i++) { //학생이 1번부터 시작하니까 1부터
        if(lost.includes(i) && reserve.includes(i)) { //lost, reserve모두 포함 학생은 체육복 개수 1로 고정
            stu[i-1] = 1; //idx를 맞추기 위해 -1
        }
        else if(lost.includes(i)) { //잃어버린 학생은
            stu[i-1]--; //체육복 개수 -1
        }
        else if(reserve.includes(i)) { //여분이 있는 학생은
            stu[i-1]++; //체육복 개수 +1
        }
    }

    for(let i=0; i<n; i++) {
        if(stu[i]==0) { //stu배열을 돌면서 체육복이 0인 학생은
            if(stu[i-1]==2) { //앞의 학생이 체육복이 2개면
                stu[i-1] = 1;
                stu[i] = 1;
            }
            else if(stu[i+1]==2) { //뒤의 학생이 체육복이 2개면
                stu[i+1] = 1;
                stu[i] = 1;
            }
        }
    }
    
    const result = stu.filter(i => i!==0); //stu배열에서 0을 제외한 배열만들기
    answer = result.length;
    return answer;
}

 

  • 참고한 다른 분의 코드
function solution(n, lost, reserve) {
    let answer = 0;
    let stu = new Array(n).fill(1);

    for(let i=0; i<lost.length; i++) {
        stu[lost[i]-1]--;
    }
    for(let i=0; i<reserve.length; i++) {
        stu[reserve[i]-1]++;
    }

    for(let i=0; i<stu.length; i++) {
        if(stu[i]===0) {
            if(stu[i-1]===2) {
                stu[i]++;
                stu[i-1]--;
            }
            else if(stu[i+1]===2) {
                stu[i]++;
                stu[i+1]--;
            }
        }

        if(stu[i]>=1) {
            answer++;
        }
    }
    return answer;
}

 

후기


  • 맨 처음 이 문제를 접근할 때 우선 n(학생 수)개로 구성된 배열을 만들고, 그 안에 초기값으로 1을 줘야겠단 생각을 먼저 하였다 (이유 : 맨 처음 체육복이 다 있다고 가정)
  • n개의 배열을 만들고 초기화를 하기 위해 찾아보던 중 자바스크립트에 Array 객체의 from() 함수가 있다는 것을 알았고, 이를 이용하면 "let stu = [0,0,0,0,0,0,0,0,0,0,0,...];" 의 경우처럼 배열의 길이가 긴 경우 직접 값을 하나하나 입력하지 않아도 초기화를 시킬 수 있다
  • Array.from() 사용법 : 첫번째 매개변수로 {length: 원하는 길이}를, 두번째 매개변수로 원하는 값을 반환하는 콜백함수를 넘겨주면 된다
  • 다른 분의 코드를 보니 이 부분에서 Array 객체의 fill() 함수를 사용하였는데, 이게 더 가독성이 좋은 것 같다
  • Array.fill() 사용법 : ex) let stu = new Array(n).fill(1); => n개의 배열에 '1'로 채우겠다는 의미
  • 내가 작성한 코드는 lost, reserve 여부에 따른 체육복 개수를 고정하는 코드와 마지막 최종 answer을 구하는 과정에서 시간을 좀 잡아먹는 것 같다
  • 다른 분의 코드가 내 코드보다 몇몇 테스트에서 더 시간이 단축돼서 결과가 나왔다
728x90

문제


https://programmers.co.kr/learn/courses/30/lessons/12901?language=javascript 

 

코딩테스트 연습 - 2016년

2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까

programmers.co.kr

 

코드


function solution(a, b) {
    var answer = '';
    const week = ['SUN','MON','TUE','WED','THU','FRI','SAT']; //일~토
    const day = new Date(`2016-${a}-${b}`).getDay(); //일~토의 index를 반환
    answer = week[day];
    return answer;
}

 

후기


  • Date 객체를 안다면 쉽게 풀 수 있는 문제이다

+ Recent posts