알고리즘 공부2 ( Splice 이용하기)

KHW·2021년 1월 19일
0

알고리즘

목록 보기
2/37

문제

주요사항

  1. 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

  2. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다

indexOf()

사용법 : 배열.indexOf('값')
값이 배열에 존재한다면 해당 배열에 따른 인덱스 번호를 리턴한다. => 0보다 작은 값이 나온다면 값이 배열에 존재하지 않는다.

코드 사항

  1. 적용시키기
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) 내용이 정상적으로 실행되지 않는다.


  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를 잘 생각 해둬야한다.

profile
나의 하루를 가능한 기억하고 즐기고 후회하지말자

0개의 댓글