프로그래머스 문제 풀이
신년 목표로 잡았던 프로그래머스 lv.1 다 풀기가 이제 얼마 남지 않았다. 아직 카카오 문제라든가.. 좀 어려워보이는 문제들 많이 남기는 했지만, 이번주 내로 다 풀고 싶다. 깃헙io에는 아직 올리지 못했던 노션 공부 자료들은.. 지금 와서 올리기에는 너무 무의미한 잔디심기가 아닌가..? 하는 생각에(귀찮아서) 블로깅을 따로 진행하지는 않을 것 같다. 지금 뭔가 블로그의 역할까지 노션에서 하는 것 같은 느낌이라 플랫폼별 정리가 필요하긴 한 것 같다.
체육복
문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 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] | 2 |
입출력 예 설명
예제 #11번 학생이 2번 학생에게 체육복을 빌려주고, 3번 학생이나 5번 학생이 4번 학생에게 체육복을 빌려주면 학생 5명이 체육수업을 들을 수 있습니다.
예제 #23번 학생이 2번 학생이나 4번 학생에게 체육복을 빌려주면 학생 4명이 체육수업을 들을 수 있습니다.
※ 공지 - 2019년 2월 18일 지문이 리뉴얼되었습니다.※ 공지 - 2019년 2월 27일, 28일 테스트케이스가 추가되었습니다.
코드
function solution(n, lost, reserve) {
var answer = 0;
for (let i = 0; i < lost.length; i += 1) {
for (let j = 0; j < reserve.length; j += 1) {
if (lost[i] === reserve[j]) {
lost[i] = "*";
reserve[j] = "*";
}
}
}
for (let i = 0; i < lost.length; i += 1) {
for (let j = 0; j < reserve.length; j += 1) {
if (lost[i] + 1 === reserve[j]) {
lost[i] = "*";
reserve[j] = "*";
}
}
}
for (let i = 0; i < lost.length; i += 1) {
for (let j = 0; j < reserve.length; j += 1) {
if (lost[i] - 1 === reserve[j]) {
lost[i] = "*";
reserve[j] = "*";
}
}
}
for (let i = 0; i < lost.length; i += 1) {
if (lost[i] !== "*") {
answer = answer + 1;
}
}
return n - answer;
}
- 여러가지 변수가 너무 많았다.
- lost = [1,2,3,4,5], reserve = [2,3,4,5,6]일 경우 빌려주고 빌려입고 하면 모든 사람이 입을 수 있지만, 자기가 여벌을 가지고 와서 그 여벌옷을 도난당하면 여벌옷이 없는셈친다. 위와 같은 경우는 n-2가 된다(1번과 6번은 체육복 없음)
-
테스트케이스가 하나만 계속 막히길래, 하나씩 천천히 수도코드를 작성하면서 퀘스트깨듯이 했다.
- 도난당한 사람과 여벌옷을 가져온 사람이 같을 경우
- 잃어버린 사람의 번호보다 여벌옷을 가져온 사람의 번호가 클 경우
- 잃어버린 사람의 번호보다 여벌옷을 가져온 사람의 번호가 작을 경우
의 순서대로 생각했다.
그래서 순서대로 조건이 맞으면 *로 바꿨다.
- 그렇게 lost 배열을 만들고, 다시 for문으로 lost를 순회하여 *이 아닌 경우에만 카운트(answer)를 올렸다.
- 그렇게 된다면 lost에서 인 학생들은 reserve에 있는 학생들에게 옷을 빌리게 된 경우이기 때문에(의 경우)
- 전체 학생수 (n)에서 *이 아닌 학생의 수를 빼면 체육 수업에 참여하지 못하는 학생의 수가 나온다.
Comments