일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 타입스크립트
- 자바스크립트 문제
- 자바스크립트 문제풀이
- 자바스크립트코딩테스트
- 자바스크립트 연결리스트
- 리액트
- 자바스크립트
- 알고리즘문제풀이
- JS
- next13
- leetcode문제풀이
- 프로그래머스
- 리액트쿼리
- til
- 제로베이스
- Next
- react
- 자바스크립트 알고리즘 문제
- NPM
- leetcode
- Baekjoon
- 프론트엔드
- CSS
- 자바스크립트 문제 풀이
- lodash
- JavaScript
- 자바스크립트 알고리즘
- Next.js13
- stack문제
- HTML
- Today
- Total
코드노트
자바스크립트 체육복 문제 풀이, 프로그래머스 본문
문제설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
체육복 문제를 풀면서 이틀동안 답을 찾지 못했다..
테스트케이스가 계속 실패를 하고 문제를 푸는 방식을 바꿔가면서 생각을 했다..
처음에는 filter로 접근을 했지만 아직까지 filter를 사용하는데 큰 스킬이 없다보니깐 한계가 있었던거 같다..
그리고 다시 배열로 접근을 하고 반복문으로도 접근을 했었는데
문제를 쉽게 풀수있는 방법을 생각하다가 새로운 방식으로 문제를 풀었다.
문제를 푸는 방식마다 다르겠지만 정렬이 중요한 방식도 있지만 정렬이 필요없는 방식도 존재했다.
무조건적으로 sort를 사용하지 않아도 된다.
어차피 순서대로 비교할게 아니기 때문...!
내가 처음에 생각했던 문제풀이는 이거였다.
1. 전체 학생에서 체육복을 잃어버린 학생수를 뺀다.
2. 잃어버린학생과 여벌이 있는 학생 중에서 겹치는 학생을 filter로 제거한다.
( 여벌이있던 학생이 잃어버리면 빌려줄수 없기 때문!)
3. 잃어버린학생과 겹치는 학생을 제거한 배열을 -1, +1 값을 비교하여 빌려줄수있는 횟수를 카운팅한다.
4. 전체학생에서 체육복을 잃어버린 학생수를 뺀 값에 빌려줄수있는 횟수를 더해준다.
이렇게 하니깐
[1, 2, 3, 4, 5]
[2, 3, 4, 5, 6]
케이스에서 오류가 났다.
이케이스를 보면 모두 빌려줄수있기 때문에 전체학생수가 답이 나와야한다.
하지만 filter로 2, 3, 4, 5 를 제외하기 때문에 서로 빌려줄수 없는 상황이 오게된다.
그래서 새로운 배열을 만들었다.
내가 푼 풀이 코드
function solution(n, lost, reserve) {
var answer = 0;
// real 배열 생성
let real = [];
for (let i = 0; i < n + 2; i++) {
real[i] = [];
}
// lost, reserve +1, -1
for (let i of reserve) {
real[i] += 1;
}
for (let i of lost) {
real[i] -= 1;
}
// 여분을 기준으로 앞뒤 확인 후 체육복을 빌려줌
for (let i = 0; i < real.length; i++) {
if (real[i] > 0) {
let front = i - 1;
let back = i + 1;
if (real[front] < 0) {
real[i] -= 1;
real[front] += 1;
} else if (real[back] < 0) {
real[i] -= 1;
real[back] += 1;
}
}
}
let min = 0;
// 체육복이 없는 학생 수를 계산.
for (let i = 1; i <= n + 1; i++) {
if (real[i] < 0) {
min += 1;
}
}
answer = n - min;
return answer;
}
1. 우선 index 학생들은 -1. +1의 값을 비교해야하기 때문에 맨처음 index 와 맨 뒤의 index자리에 공간을 넣기 위해서
전체학생수보다 +2를 하여 배열의 자리를 넣어주었다.
2. 각 배열을 돌면서 잃어버린학생의 index에는 -1을 넣어주고 여우가 있는 학생은 +1을 해주었다.
3. 각 인덱스의 앞뒤를 비교하면서 여분이 있는 학생을 -1로 시켜주고 잃어버린학생에게 +1을 해주었다.
4. min에는 체육복이 없는 학생수를 카운트 해주었다. -1이면 체육복이 없는학생이다!
* 여기서 real의 배열에서 값을 하나씩 더해주기만 했었는데 +1인 학생들이 있기 때문에 값이 달라졌다.. 문제의 답은 체육복이 없는 학생만 구하면 되는거기 때문에 -1값을 가진 학생의 수만 찾으면 끝이였다!
5. 그리고 전체학생수에서 min을 빼주면 끝이였다.
filter로 하는 풀이가 있었는데 이해가 되지 않았다..
이해하고 글을 수정해야겠다...! 그래도 이렇게 풀고나니깐 기분이 정말 좋아졌다.. 이맛에 코딩테스트문제푸는거같다..ㅋㅋㅋ
'Code note > 자바스크립트 알고리즘 문제풀이' 카테고리의 다른 글
자바스크립트 접두사 구하기 문제풀이 (0) | 2022.09.08 |
---|---|
자바스크립트 로마숫자 코딩테스트 문제 풀이 Roman to Integer (0) | 2022.09.08 |
행렬의 덧셈 문제 풀이 2차원 배열 (0) | 2022.09.03 |
프로그래머스 직사각형 별찍기 문제풀이 (0) | 2022.09.02 |
프로그래머스 모의고사 문제풀이, 완전탐색 부분 (0) | 2022.09.02 |