728x90
요약: 문제에서 주어진 tickets배열을 먼저 sort한 후 배열을 순서대로 읽으면서 바로 이전 원소와 비교해서 차가 0 또는 1 이면 같은 그룹으로 판단 하면서, 현재 그룹의 길이를 카운팅 해줍니다. 그리고 같은 그룹이 아닌 경우 그룹의 길이를 1로 초기화 시키고 모든 그룹의 길이중 가장 큰 값을 저장하여 리턴합니다.
#include <bits/stdc++.h> // 모든 표준 라이브러리 헤더들을 가져오는 전처리문
using namespace std; // std라는 namespace에서 사용하려고 한다. 그냥 암기하면 됨
/*
각 element의 타입이 int인 벡터(=배열) tickets를 매개변수로 받아서, 결과값(int타입)을 리턴하는 함수
1. 벡터를 sort한다.
2. 벡터의 각 원소를 차례대로 sweeping하면서(순서대로 읽으면서),
바로 이전 원소와 비교해서 diff가 0 또는 1이면 같은 시퀀스(그룹)로 판단한다.
*/
int maxTickets(vector<int> tickets) {
int n = tickets.size(); // int형 변수 n에다가 벡터 tickets의 길이를 대입
sort(tickets.begin(), tickets.end()); // 벡터 tickets의 시작부터 끝을 정렬. (3번째 파라메터에 아무 것도 넣지 않으면 기본적으로 오름차순 정렬)
int result = 0; // 결과값을 저장하는 변수 (모든 그룹의 길이들 중 최대값)
int current_s_len = 0; // 현재 그룹 s의 길이.
for (int i=0; i<n; i++) { //i를 0부터 시작해서, n 미만일 동안 i를 증가시킨다.
if (i == 0 || tickets[i] - tickets[i-1] <= 1) { //i가 0이거나(처음 들어온 원소이거나), 현재 원소와 이전 원소의 차가 1 이하면
++current_s_len; //current_s_len을 증가시킨다. (즉, 그룹의 cnt를 늘린다.)
}
else { //아니라면. 즉 i번째 티켓과 i-1번째 티켓이 다른 그룹임을 의미
if (result < current_s_len) { // result보다 i-1번째 티켓이 속하는 그룹의 길이가 크면
result = current_s_len; // 갱신한다. (result는 모든 그룹의 길이들 중 최대값, 처음에는 0으로 세팅) 다시 말해, result는 여태까지 지나온 값을 말함
}
current_s_len = 1; // i번째 티켓부터 새로운 그룹이니까 current_s_len을 1로 바꾼다.
}
}
if (result < current_s_len) { // 마지막 그룹의 크기가 가장 큰 경우, 갱신이 필요하다.
result = current_s_len; //
}
return result; // result를 리턴
}
int main()
{
int n; // 길이 n 선언
cin >> n; // 길이 입력
vector<int> tickets(n); // 크기가 n인 벡터 tickets 선언
for (int i=0; i<n; i++) { // n개의 티켓 크기 입력
cin >> tickets[i];
}
int answer = maxTickets(tickets); // maxTickets 함수를 호출해서 answer 변수에 저장
cout << "\n" << "정답: "<< answer; // 출력해서 확인
return 0; //정상 종료됨을 의미하는 return 0
}
주석 제거용
#include <bits/stdc++.h>
using namespace std;
int maxTickets(vector<int> tickets) {
int n = tickets.size();
sort(tickets.begin(), tickets.end());
int result = 0;
int current_s_len = 0;
for (int i=0; i<n; i++) {
if (i == 0 || tickets[i] - tickets[i-1] <= 1) {
++current_s_len;
}
else {
if (result < current_s_len) {
result = current_s_len;
}
current_s_len = 1;
}
}
if (result < current_s_len) {
result = current_s_len;
}
return result;
}
int main()
{
int n;
cin >> n;
vector<int> tickets(n);
for (int i=0; i<n; i++) {
cin >> tickets[i];
}
int answer = maxTickets(tickets);
cout << "\n" << "정답: "<< answer;
return 0;
}
'알고리즘' 카테고리의 다른 글
[2021 ICT 하반기] 5번 문제 (0) | 2021.07.16 |
---|---|
[2021 ICT 하반기] 4번 문제 (0) | 2021.07.16 |
[2021 ICT 하반기] 3번 문제 (0) | 2021.07.15 |
[2021 ICT 하반기] 2번 문제 (0) | 2021.07.15 |