본문 바로가기
코딩테스트

[1일1코👨🏻‍💻] Lv.1 체육복.js - 프로그래머스

by Jacob93 2020. 9. 5.

2020.09.04

출처 : 프로그래머스

📝문제

https://programmers.co.kr/learn/courses/30/lessons/42862#

✏️해답

function solution(n, lost, reserve) {
    var answer = 0;
    var total = [];

    /// 전체 학생을 1로 세팅
    for(var i=0;i<n;i++){
        total.push(1);
    }

    /// 여벌의 옷이 있는 학생 +1씩
    for(var i=0;i<reserve.length;i++){
        total[reserve[i]-1]++;
    }

    // 잃어버린 학생 -1씩
    for(var i=0;i<lost.length;i++){
        total[lost[i]-1]--;    
    }

    // 도난 당한 사람 주변에 2개인 사람꺼 빌려주기
    for(var i=0;i<n;i++){
        if(total[i]==0){
            if(i>0 && total[i-1]>=2){
                total[i-1]-=1
                total[i]=1;
                answer++;
            }else if(i<=n&&total[i+1]>=2){
                total[i+1]-=1;
                total[i]=1;
                answer++;
            }
        }else{
            answer++;
        }
    }

    return answer;
}
  • 오답

    function solution(n, lost, reserve) {
      var answer = 0;
      var num=0;
      for(var i=0;i<reserve.length;i++){
          for (var j=0;j<lost.length;j++){
              if(reserve[i]===lost[j]){
                  lost.splice(j,1);
                  reserve.splice(i,1);
                  i--;
              }
          }
      }
      var student = n-lost.length;
      console.log('student' + student);
      console.log(lost);
      console.log(reserve);
      lost.sort(function(a,b){return b-a});
      reserve.sort(function(a,b){return b-a});
    
      /// 빌려줄 애가 더 많을때
      if(lost.length<=reserve.length){
          for(var i=0;i<lost.length;i++){
              for(var j=num;j<reserve.length;j++){
                  if(lost[i]===reserve[i]){
                      student++;
                      num++;
                      break;
                  }
                  if(lost[i]-reserve[j]===1){
                      student++;
                      num++;
                      break;
                  }
                  if(reserve[j]-lost[i]===1){
                      student++;
                      num++;
                      break;
                  }
              }
          }
      }
    
      /// 안가져온 애가 더 많을때
      else{
          for(var i=0;i<reserve.length;i++){
              for(var j=answer;j<lost.length;j++){
                  if(lost[i]===reserve[i]){
                      student++;
                      num++;
                      break;
                  }
                  if(reserve[i]-lost[j]===1){
                      student++;
                      answer++;
                      break;
                  }
                  if(lost[j]-reserve[i]===1){
                      student++;
                      answer++;
                      break;
                  }
              }
          }
      }
    
      return student;
    }

입출력 예
solution(10,[1,7,8,9],[2,3,4,5,6]); // return : 8
solution(5, [2, 4], [3]); //return : 4
solution(5,[2,4],[1,3,5]); return : 5
solution(5,[2,4],[3]); // return : 4
solution(3,[3],[1]); //return : 2
solution(15,[1,2,3,4,5,7,8,9,10],[6,11,12]); //return : 8
solution(10,[1,2,3],[2,3,8,9,10]); //return : 9

회고🧐

우선 너무 코드가 길고 더러움. 개선이 필요. 개선을 위해선 함수를 알아야 한다.
2020.09.15 결국 풀었는데, 시나리오를 보고 풀었더니 풀림.

<시나리오>

먼저 학생들의 수 만큼 학생들이 가진 옷의 갯수를 value로 하는 배열을 만들어주고, 옷의 갯수는 모두 가져왔으므로 1로 셋팅한다.

여벌 옷을 가져온 학생 reverse 배열을 순회하면서 옷의 갯수를 1 추가한다.

그리고 옷을 도둑맞은 학생들을 뜻하는 reverse 배열을 순회하면서 옷을 도둑맞은 학생들의 옷의 갯수를 1 감소시킨다.

 

학생들이 현재 가진 옷의 갯수를 나타내는 배열 셋팅을 완료했다.

해당 배열을 순회하면서 

만약 옷이 없는 학생의 경우, 앞의 학생이 가진 옷의 갯수가 2개 이상이거나, 뒤의 학생이 가진 옷이 2개 이상이면

해당 학생의 값을 1 증가하고 앞 또는 뒤에 있는 학생의 옷의 갯수를 1 감소시킨다.

댓글