GitHubSeob
C++ / 프로그래머스 / 체육복 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
문제풀이
정렬의 중요성을 모르고 풀다가 계속 틀리길래 반례를 찾아보다가 정렬을 해야 된다는 댓글을 보고 정렬을 추가했다.
lost에는 잃어버린 학생의 번호, reserve에는 여벌의 체육복이 있는 학생의 번호가 들어있다.
체육복을 빌리거나 빌려주면 해당 배열에 있는 학생 번호의 값을 0으로 바꾼다.
총 학생수 - 도난당한 학생수를 한 후 체육복을 얻을 때마다 결과에 +1을 한다.
도난당한 학생이 여벌의 체육복을 갖고 있다면 자기가 입어야 하므로 +1을 하고 배열에서 값을 0으로 바꾼다.
lost, reserve의 크기만큼 반복문을 돌리면서 잃어버린 학생 번호-1 or +1에 해당하는 번호의 학생이 여벌의 체육복을 가지고 있다면 결과에 +1을 한다.
코드
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
int l = 0, r = 0;
answer = n - lost.size();
sort(lost.begin(), lost.end());
sort(reserve.begin(), reserve.end());
for (l = 0; l < lost.size(); ++l) {
for (r = 0; r < reserve.size(); ++r) {
if (lost[l] == reserve[r]) {
answer++;
lost[l] = 0;
reserve[r] = 0;
}
}
}
for (l = 0; l < lost.size(); ++l) {
for (r = 0; r < reserve.size(); ++r) {
if (lost[l] != 0 && reserve[r] != 0) {
if (lost[l] - 1 == reserve[r]||lost[l]+1==reserve[r]) {
reserve[r] = 0;
answer++;
break;
}
}
}
}
return answer;
}
'Programmers > Level 1' 카테고리의 다른 글
C++ / 프로그래머스 / 음양 더하기 (0) | 2021.08.08 |
---|---|
C++ / 프로그래머스 / 모의고사 (0) | 2021.08.08 |
C++ / 프로그래머스 / 로또의 최고 순위와 최저 순위 (0) | 2021.08.04 |
C++ / 프로그래머스 / 행렬의 덧셈 (0) | 2021.08.04 |
C++ / 프로그래머스 / 직사각형 별찍기 (0) | 2021.08.04 |