js 프로그래머스 체육복

이명진·2022년 9월 16일
0

코드카타

목록 보기
41/69

문제 요약

학생들은 번호순서대로 되어 있다. 체육복을 도둑맞은 사람에게 2개가져온 사람이 앞뒤 번호에게 빌려줄수 있는데 이때 체육복을 다 입은 학생수를 구하면된다.

내가 푼 풀이

function solution(n, lost, reserve) {
    let answer = {};
  	let realAnswer = [];
  	for(let i=1;i<=n;i++){
      answer[i]=1;
    }
  	let newLost = lost.sort().filter(x=>{
      return !reserve.includes(x)
    })
  	let newReserve = reserve.sort().filter(x=>{
      return !lost.includes(x)
    })
  	
  	newLost.map(x=>{
      if(answer[x]){
        answer[x]-=1
      }
    })
  	console.log(answer)
  	newReserve.map(x=>{
      
      if(answer[x]){
        
         if(!answer[x-1] && answer[x-1]!==undefined){
           console.log(x)
          answer[x-1]+=1
        }else if(!answer[x+1] && answer[x+1]!==undefined){
          answer[x+1]+=1
        }
      }else if(!answer[x]){
        answer[x]+=1
      }
    })
  	for(let keys in answer){
      if(answer[keys]){
        realAnswer.push(keys*1)
      }
    }
  console.log(realAnswer)
    return realAnswer.length;

레벨 1치고는 조금 어려웠다.
첫번째 풀이때는 일단 학생수와 체육복 갯수를 1로 다 맞춰서 기본설정을 객체로 해준다. 두번째로는 lost, reserve 별로 체육복 갯수를 빼고 더해주었다.

이렇게 풀었는데 테스트 케이스는 다맞았는데 제출해보니 반타작했다.
뭐가 틀린건지 몰라서 질문하기를 봤다. 대략 모든 댓글들 끝까지 다 살펴보았다.
주의사항 및 팁으로 sort를 사용할것, 두개 가져온 학생들 중에 도난당한 학생이 중복일 경우가 있는데 그들은 빌려줄수 없으니 lost 와 reserve 배열에서 중복을 제거해야 한다는 것이었다.
첫번째로 중복을 제거해주는 방법으로 newLost 와 newReserve 를 만들어서 중복을 제거해주었다.
배열 끼리 중복 제거 하기 위해서는 filter와 includes를 사용하면된다

Array.filter(x=>return arr2.includes(x))  

이렇게하면 서로의 중복값은 삭제시켜준다.

이렇게 수정하니 70% 맞았다. 다시 수정을 위해서 코드를 쭉 훑어보니
순서 문제가 있었다. 나는 만약에 빌려줄때 뒤에 학생부터 (x+1) 빌려주었는데
앞에 학생부터 빌려줘야 앞뒤로 빌려줄경우 다 빌려줄수 있다.
에시로 4명의 학생이 있을때 2,4 번이 체육복이 두벌이고 1,3이 없을 경우
먼저 뒤에 학생부터 빌려주게 되면 2번이 3번을 빌려주고 4번은 뒤에 학생이 없고
앞에는 이미 2번이 빌려주었으니 답이 2,3,4가 나온다. 하지만 앞에 번호 먼저 빌려주면
1,2,3,4 모두가 체육복을 입을수 있다.

이렇게 순서를 앞에 번호로 변경해주고 다시 제출하니 18,20 번이 틀렸다.
여기서는 해결하는데 시간이 걸렸는데 왜냐하면 테스트 케이스 몇개를 돌렸을때 내가 순서를 변경해서 돌려도 순서 상관없이 다 빌려주는 값들만(성공값)나왔기 때문이다.

다시 몇번의 테스트 케이스를 손봐서 돌려보니 앞전의 상황이 나타났다. map이기 때문에 순서대로 돌았는데 1,2,3 인데 3,1,2 이렇게 되어있으면 3번먼저 처리를 하기 때문에 순서 문제가 또 문제가 되었다.

그래서 sort()를 사용해서 정렬해주고 빌려주니 성공할수 있었다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글