boj 10610번 문제를 통해 정말 오랜만에 접해보는 3의 배수인지 아닌지 판단하는 판단법에 관하여.

주어진 수가 3의 배수인지 판단하는 방법중에, 각각의 자리수들의 합이 3의 배수인가 확인하는 방법이

예전에 고등학교 수학시간에 배웠던것으로 기억이 난다. 이 문제의 예제 코드를 통해서 다시 접하게 된 방법이다. 

이와 관련된 증명은 

아래 블로그를 통해서 쉽게 확인할 수 있다. 

https://blog.naver.com/PostView.nhn?blogId=sctivcrmnfe&logNo=220859963688 

 

3. (2,3,4,5,6,8,9) 배수 판별법 및 증명-1

기본적인 배수 판별법이다. 2의 배수 판별법: 일의 자리수가 0,2,4,6,8 이면 2의 배수이다. 3의 배수 ...

blog.naver.com

 

 

그리고 이번 문제를 통해 접하게된 stl 함수의 경우는,

accumulate() 이다. 

이 경우 accumulate 함수는 누적합을 구하는 함수이다. 

과거에도 한번 accumulate 함수를 접한적이 있었는데, 이때에 accumulate의 뜻은

모으다, 축적하다 는 의미

그래서 accumulate 함수는 기준으로 제시하는 값을 넣어주고, 컨테이너의 어디서부터 어디까지의 값들을 더할지를 넣어주면

그 원소들의 누적합을 계산해주는 함수이다. 

그래서

int sum=accumulate(nums.begin(),nums.end(),0); 의 경우는, 

nums 벡터에 있는 모든 원소들을 시작값을 0으로 해서 누적합을 구해서 반환해서 sum에 대입하는 연산을 하는 것이다. 

accumulate 함수를 모르면 그냥 for문을 활용해서 모두 더해도 되지만, 이렇게 accumulate 함수를 알면 함수를 활용해서 코드를 작성할 수 있다. 분명 과거에도 봤던 함수인데 아직도 익숙치 않아서 오늘 다시 접했을때도 다시 검색해보았지만, 이번에 한번 더 신경써서 외워보도록 하고, 나중에 또 접하게 되면 그때 또 다시 공부해서 계속적으로 공부해서 익숙해지고 내것으로 만들도록 해보자. 

 

 

그리고 vector에서 내장함수 back()이 있는데, 이때 back은 가장 뒤의 원소의 값을 반환하는 함수이다. 

back() 함수를 통해서 가장 뒤의 원소를 확인하는 방법도 익히도록 하자. 

#include <bits/stdc++.h>
using namespace std;

string N;
vector<int> nums;
int main(void) {
  ios::sync_with_stdio(0);
  cin.tie(0);

  cin >> N;
  for (char c : N)
    nums.push_back(c - '0');

  sort(nums.begin(), nums.end(), greater<int>());
  int sum = accumulate(nums.begin(), nums.end(), 0);
  if (sum % 3 == 0 && nums.back() == 0)
    for (int n : nums) cout << n;
  else
    cout << -1;
}
/*
30의 배수가 되려면 10의 배수인 동시에 3의 배수이어야 합니다.
10의 배수는 숫자 안에 0이 존재하는지로 판별하고,
3의 배수는 각 숫자의 자릿수의 합이 3의 배수인지로
판별할 수 있습니다.
만약 30의 배수가 될 수 있음이 확인된다면,
큰 숫자부터 출력합니다.
*/

 

++++++++++++++++++++++

이 문제에서 바로 수에 %3 을 해서 3의 배수인지 구하기 보단, 각각의 자리수들의 합을 이용해서 구했기 때문에, 이 경우 각각의 숫자들을 이용한 수를 만드는 연산을 진행하지 않아도 되었고, 그저 숫자들을 출력해서 일렬로 나열해서 숫자를 만들어낼 수 있었다. 

 

이때에 각 자리 수들의 합을 통한 %3의 판단과, 그냥 수 자체에 대한 %3 의 판단은 큰 차이를 일으키는 부분은 아닐것이다. 

이와 관련하여서 검색한 부분을 첨부한다. 

 

그렇기 때문에 각 자리수들의 합을 이용해서 3의 배수인지를 판단하는 방법을 통해서 아직 자릿수들을 하나의 수로 만들기 전에 이 자리수들을 이용한 수가 3의 배수가 될 수있는지를 판단할 수 있고, 그대로 수를 하나의 수로 합칠 필요없이 그저 수를 일렬로 출력해서 나열해주는 것을 통해서 출력값을 만들어줄 수 있는 이점이 있는 상황으로 판단할 수 있겠다. 

  Comments,     Trackbacks