All Articles

Lv1. 체육복

문제 및 답안

문제

전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

입출력 예

n lost reserve return
5 [2, 4] [1, 3, 5] 5
5 [2, 4] [3] 4
3 [3] [1]
*5 [1, 2, 3, 4, 5] [1, 2, 3, 4, 5] 5
*5 [4, 5] [3, 4] 4

JavaScript 답안

function solution(n, lost, reserve) {
    var answer = 0;
    var haveNum = n - lost.length; 
  	// 전체 인원에서 도난당한 사람을 빼준다.
  	// haveNum은 체육복을 가진 사람의 숫자이다.

  	// 여벌의 체육복을 지녔지만 도난당한 사람이 있다면 
  	// 배열에서 지우고 haveNum 카운트를 올린다.
    for (let i = 0; i < lost.length; i++) {
        if (reserve.indexOf(lost[i]) !== -1) {
            reserve.splice(reserve.indexOf(lost[i]), 1);
            lost.splice(i, 1);
            haveNum ++;
            i--;				
          	// 일부러 포문을 사용한 이유가 있는데,
          	// 위에 있는 *의 테스트 케이스를 통과하기 위해서이다.
          	// 중복되는 모든 경우를 제거하기 위해서 i값을 다시 -1 해주었다.
        }
    }
	
  	// 잃어버린 사람 앞이나 뒤에 여벌의 체육복을 가진 사람이 있다면,
  	// 체육복을 빌리고, haveNum을 카운트한다.
    for (let num of lost) {
        let frontCheck = reserve.indexOf(num - 1)
        let behindCheck = reserve.indexOf(num + 1)
		
    // 잃어버린 학생이 3, 5 / 여벌가진 학생이 4 였을때
    // 4번 학생이 3번에게 빌려주고 
    // 또 다시 5번에게 빌려주는 경우를 제거하기 위해서
    // 빌려준 학생은 배열에서 제외시킨다.
        if (frontCheck !== -1) {
            reserve.splice(frontCheck, 1);
            haveNum++;
        } else if (behindCheck !== -1) {
            reserve.splice(behindCheck, 1);
            haveNum++;
        }
    }

    answer = haveNum;
    return answer;
}

다른 사람 풀이 코드

function solution(n, lost, reserve) {      
    return n - lost.filter(a => {
        const b = reserve.find(r => Math.abs(r-a) <= 1)
        if(!b) return true
        reserve = reserve.filter(r => r !== b)
    }).length
}
// 좋은 코드인지는 내가 능력이 부족해 잘 모르겠지만, 
// 다른 코드에 비해 압도적으로 짧아서 첨부해보았다.

어려웠던 점

  • 이 문제에서 가장 많이 헤맨것은 예시 케이스는 통과해도 채점했을때는 안되는 케이스가 많았기 때문이다.

    • 결론은 테스트 케이스를 항상 고려하면서 코드를 짜야겠다.
  • 마지막에 7번 케이스가 어떤 경우인지 몰라서 헤맸다. 좀 더럽게 짰다는 느낌이 항상 드는데, 꼭 다시 풀어봐야겠다.

    • 테스트 케이스를 추가해보니 여벌의 체육복을 가진 사람이 모두 도난당했을 때의 경우로 추정된다.

출처: 프로그래머스