문제
리뷰
문제에서 주의할 점은 이 문장이다.
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다.
- 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
이 점 때문에 헷갈릴 것 같아서. 여벌 가진 학생과 도난당한 학생을 따로 처리했다.
// answer 초기화. 모든 학생이 자신의 체육복을 가지고 있다고 가정한다.
int answer = n ;
// 1. 모든 학생이 1개의 체육복을 가지고 있다고 가정한다.
vector<int> student(n+1, 1);
// 2. 여벌 있는 학생만 + 1
for (auto i : reserve) {
student[i]++;
}
// 3. 도난 당했다면 -1
for (auto i : lost) {
student[i]--;
if (student[i] == 0) answer--; // 0 이라면 정답에서 빼준다.
}
자신의 앞이나 뒤의 학생에게만 체육복을 빌려줄 수 있다.
따라서 [ 2, 0 ] 인 경우, 내 뒤에 학생에게 빌려주면 [ 1 , 1] 이 된다.
[ 0, 2 ] 인 경우에도, 똑같이 [ 1, 1] 이 된다.
이 두 가지 경우에만 answer를 증가시킬 수 있다.
학생 두 명을 동시에 확인하니까 반복문 인덱스를 주의해야 한다.
for (int i = 1; i < n; i++) { // 빌려줄 수 있는 경우는 (2, 0) 그리고 (0, 2) 인 경우 뿐이다.
if (student[i] == 2 && student[i+1] == 0) {
student[i] = student[i + 1] = 1;
answer++;
}else if(student[i] == 0 && student[i + 1] == 2) {
student[i] = student[i + 1] = 1;
answer++;
}
}
코드
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = n;
vector<int> student(n+1, 1); // 1로 초기화
for (auto i : reserve) { // 여벌 있으면 + 1
student[i]++;
}
for (auto i : lost) { // 도난 당했다면 -1
student[i]--;
if (student[i] == 0) answer--;
}
for (int i = 1; i < n; i++) { // 빌려줄 수 있는 경우는 (2, 0) 그리고 (0, 2) 인 경우 뿐이다.
if (student[i] == 2 && student[i+1] == 0) {
student[i] = student[i + 1] = 1;
answer++;
}else if(student[i] == 0 && student[i + 1] == 2) {
student[i] = student[i + 1] = 1;
answer++;
}
}
return answer;
}
728x90
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 징검다리 건너기 c++ (0) | 2021.01.31 |
---|---|
[프로그래머스] 실패율 c++ (0) | 2021.01.31 |
[프로그래머스] 최대공약수와 최소공배수 c++ (0) | 2021.01.19 |
Hacker Rank - Angry Professor (0) | 2021.01.19 |
Hacker Rank - Operators (0) | 2021.01.19 |