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

+ Recent posts