반응형
리뷰
https://www.acmicpc.net/problem/24465
7명의 멤버와 별자리가 겹치지 않는 지원자를 출력하는 문제
별자리를 일일히 세팅을 해주기 싫어 방법을 찾았으나 1월이 주어졌을때 12월의 별자리인 경우가 좀 짜증났다.
풀고 나니 내림이 아닌 올림을 하면 더 편하게 접근할 수 있을 것 같다.
전역 변수
- byeol : 각 월의 별자리의 경계일을 저장할 정수형 배열
- v : 멤버의 별자리를 체크하기 위한 정수형 배열
- MD : 별자리가 겹치지 않는 지원자의 월, 일을 저장하고, sort용 비교함수를 넣는 구조체
- ans : 별자리가 겹치지 않은 지원자들을 모아둔 MD타입 벡터
함수
없음
문제풀이
- 먼저 7명의 멤버 생일을 입력 받고, 각 별자리에 해당하는 v의 인덱스에 체크를 해준다.
- 지원자의 수 n을 입력 받고, n번의 반복문을 실행해 준 뒤 각 지원자의 생일을 입력 받는다.
- 만약 지원자의 별자리가 멤버의 별자리와 일치하지 않는다면 ans벡터에 생일을 추가해 준다.
- 탐색이 끝난 후 ans벡터를 오름차순으로 정렬한다.
- ans벡터가 비었을 경우 ALL FAILED를, 아니라면 생일을 줄바꿈을 기준으로 출력해 준다.
참고 사항
입력받은 월을 byeol 배열의 인덱스로 사용하고, 배열의 값보다 일이 작을 경우 이전월의 별자리로 보면 된다.
위에서 언급했듯 차라리 배열의 값보다 일이 클 경우만 다음월의 별자리로 보는 것이 더 편할듯 하다.
정답 코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int byeol[13] = { 0, 20, 19, 21, 20, 21, 22, 23, 23, 23, 23, 23, 22 };
int v[13];
struct MD {
int m, d;
bool operator<(const MD& other) const {
if (m == other.m) return d < other.d;
return m < other.m;
}
};
vector<MD> ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for (int i = 0; i < 7; i++) {
int m, d; cin >> m >> d;
if (d < byeol[m]) {
m--;
if (!m) m = 12;
}
v[m] = 1;
}
int n; cin >> n;
while (n--) {
int m, d; cin >> m >> d;
if (d < byeol[m]) {
int temp = m - 1;
if (!temp) temp = 12;
if (!v[temp]) ans.push_back({ m, d });
}
else if (!v[m]) ans.push_back({ m, d });
}
sort(ans.begin(), ans.end());
if (ans.empty()) cout << "ALL FAILED";
else {
for (const MD& md : ans) cout << md.m << " " << md.d << "\n";
}
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[L2] 프로그래머스 더 맵게 C++ 우선순위 큐 (0) | 2024.10.25 |
---|---|
[L2] 프로그래머스 주식가격 C++ 우선순위 큐 (1) | 2024.10.25 |
[L3] 프로그래머스 베스트앨범 C++ 해시맵, 우선순위 큐 (0) | 2024.10.24 |
[S2] 백준 24938번 키트 분배하기 C++ 그리디 알고리즘, 덱 (0) | 2024.10.23 |
[P3] 백준 13505번 두 수 XOR C++ 트라이, 트리 (0) | 2024.10.22 |