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을 구하는 과정에서 시간을 좀 잡아먹는 것 같다
  • 다른 분의 코드가 내 코드보다 몇몇 테스트에서 더 시간이 단축돼서 결과가 나왔다

+ Recent posts