여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다
사용법 : 배열.indexOf('값')
값이 배열에 존재한다면 해당 배열에 따른 인덱스 번호를 리턴한다. => 0보다 작은 값이 나온다면 값이 배열에 존재하지 않는다.
- 적용시키기
const reserve_length = reserve.length, lost_length = lost.length
for(let i=0;i<reserve_length;i++)
{
if(lost.indexOf(reserve[i])>=0) //reserve에 배열값이 lost에 존재한다면
{
lost.splice(lost.indexOf(reserve[i]),1); //lost에 배열값에 해당하는 값 하나를 빼낸다.
reserve.splice(i,1) //reserve배열의 해당 배열을 만족시키는 위치의 값을 같이 제거
i--; // 값을 제거하므로 길이가 줄기 때문에 그것을 방지하기 위한 i--;
}
}
주의 할 점은
lost.splice(lost.indexOf(reserve[i]),1);
reserve.splice(i,1)
두개의 위치가 바뀌면 안된다는 것이다.
reserve가 먼저 바뀌면 reserve의 배열크기가 바뀌므로 lost.splice(lost.indexOf(reserve[i]),1)
내용이 정상적으로 실행되지 않는다.
- 적용시키기
for(let j=0;j<lost_length;j++)
{
if(reserve.indexOf(lost[j]-1)>=0)
{
reserve.splice(reserve.indexOf(lost[j]-1),1);
lost.splice(j,1);
j--;
}
else if(reserve.indexOf(lost[j]+1)>=0)
{
reserve.splice(reserve.indexOf(lost[j]+1),1);
lost.splice(j,1);
j--;
}
}
return n-lost.length;
기본적으로 앞의 체육복을 빌릴수있으면 빌리나 안된다면(else if) 뒤에있는 학생의 체육복을 빌리는 코드를 작성한다.
마찬가지로indexOf
에 영향을 받는 reserve 배열을 먼저 splice하고 나중에 lost배열을 splice한다.
function solution(n, lost, reserve) {
const reserve_length = reserve.length, lost_length = lost.length
for(let i=0;i<reserve_length;i++)
{
if(lost.indexOf(reserve[i])>=0){
lost.splice(lost.indexOf(reserve[i]),1);
reserve.splice(i,1)
i--;
}
} //자신의 교복을 잃어버리고 여분이 있을때
for(let j=0;j<lost_length;j++)
{
if(reserve.indexOf(lost[j]-1)>=0) //자기앞의 여분 교복이 있을때
{
reserve.splice(reserve.indexOf(lost[j]-1),1);
lost.splice(j,1);
j--;
}
else if(reserve.indexOf(lost[j]+1)>=0) //자기뒤의 여분 교복이 있을때
{
reserve.splice(reserve.indexOf(lost[j]+1),1);
lost.splice(j,1);
j--;
}
}
return n-lost.length;
}
이렇게 코드가 나타난다.
splice 생각할게 많다. 영향을 많이받아 함수로 헷갈리게 쓰면 복잡해진다.
indexOf를 잘 생각 해둬야한다.