[코딩테스트 C++] 체육복
오늘의 문제
https://programmers.co.kr/learn/courses/30/lessons/42862
체육복
나의 풀이
#include <string>
#include <vector>
using namespace std;
int solution(int n, vector<int> lost, vector<int> reserve) {
for(int i=0;i<lost.size();i++){
for(int j=0;j<reserve.size();j++){
if(lost[i] == reserve[j]){
lost.erase(lost.begin()+i);
reserve.erase(reserve.begin()+j);
i--;
break;
}
}
}
int answer = n - lost.size();
for(int i=0;i<lost.size();i++){
int n = lost[i];
for(int j=0;j<reserve.size();j++){
if( reserve[j] == n-1){
reserve.erase(reserve.begin()+j);
answer++;
break;
}
if(reserve[j] == n+1){
reserve.erase(reserve.begin()+j);
answer++;
break;
}
}
}
return answer;
}
풀이 법
- 일단 입력범위가 얼마 되지않아 마음 편하게 풀었다.
- 잃어버렸는데 여분이 있는 인원은 제외한 후 잃어버린 사람의 앞 뒤 사람이 여분인원에 있는지 체크했다.
- answer은 n - 잃어버린 사람 수 로 초기화 해두었고, 여분을 받고 사라지는 순간 1을 더했다.
- 숫자가 크지 않아 좋았다. 오늘 ㄴㅁ블은 숫자가 너무 커서 감당이 안되더라. 큰 숫자에 대한 연습도 필요하다.
모범 답안
#include <string>
#include <vector>
using namespace std;
int student[35];
int solution(int n, vector<int> lost, vector<int> reserve) {
int answer = 0;
for(int i : reserve) student[i] += 1;
for(int i : lost) student[i] += -1;
for(int i = 1; i <= n; i++) {
if(student[i] == -1) {
if(student[i-1] == 1)
student[i-1] = student[i] = 0;
else if(student[i+1] == 1)
student[i] = student[i+1] = 0;
}
}
for(int i = 1; i <=n; i++)
if(student[i] != -1) answer++;
return answer;
}
배울 점
- 배열을 만들어 있는 사람 없는사람을 체크하여 주위를 체크한다. 좋은방법이다. 직접비교하는 대신 메모리를 사용한것
Author And Source
이 문제에 관하여([코딩테스트 C++] 체육복), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@huijae0817/코딩테스트-C-체육복저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)