[C++] 백준 1769번 풀이 ( 3의 배수 )

정민경·2024년 1월 2일
0

baekjoon

목록 보기
50/57
post-thumbnail

- 문제 ( 1769번 ) : 3의 배수

  • 1,000,000 자리 이하의 수를 입력받아, 각 자리의 수를 단순히 더해 새로운 수를 만든다. ( 이 과정이 변환 횟수 한번 )
  • 이 과정을 계속 반복해서 한자리수로 변환한 후 3의 배수인지 확인하는 문제.
  • 즉, 출력은 다음 2개의 정보를 출력해야 한다.
    1) 입력받은 수를 몇번 거쳐야 한 자리 수의 숫자를 만들 수 있는지
    2) 입력받은 수가 3의 배수인지에 대한 "YES" or "NO" 정보

- 입력 및 출력

[ 입력 ]

  • 첫째 줄에 큰 자연수 X 입력 ( X 는 1,000,000 이하의 자연수이며, 0으로 시작 x )

[ 출력 ]

  • 첫째 줄에 몇번의 변환을 통해 한 자리의 새로운 수를 만들었는지 출력 ( 이 수는 음이 아닌 정수 )
  • 둘째 줄에는 입력받은 수가 3의 배수인지에 대한 정보 출력
    => 3의 배수라면 "YES" 를, 그렇지 않다면 "NO" 를 출력

- 문제 풀이

  • 이번 "3의 배수" 문제는 몇가지만 고려하면 정말 간단한 문제이다.

    이 문제를 풀면서 고려해야할 사항은 다음과 같다.

    [ 고려사항 ]

    1. 입력의 크기가 1,000,000 자리수이다. 즉, 큰 입력값을 가진다.
    2. 출력은 모두 대문자이다.
  • 고려사항 1의 경우 나는 c++ 로 해결했기 때문에 문자열로 입력받아 std::to_string() 과 stoi() 를 적절히 사용해 해결했다.

    1. 입력값이 매우 큰 수가 들어올 수 있기 때문에 문자열로 입력받고
    2. 각 자리수를 더할땐 입력받은 string[i] - '0' 을 통해 int 값의 연산을 하고
    3. 변환한 수의 자리가 1자리라면 stoi() 함수를 사용해 string to int 로 값을 변환해 3의 배수인지 확인했다.
  • 고려사항 2의 경우, 제대로 확인하지 못해서 굉장히 애를 먹었다... 앞으로는 주어진 조건을 잘 확인할것!


- 최종 코드

#include <iostream>
#include <cstring>


// global variables
int count = 0; // count == change count
int length = 0; // length == string length


// get number from string
int get_number(std::string a) {
  int result = 0;

  for(int i = 0; i < length; i++) {
    result += (a[i] - '0');  
  }

  return result;
}


// print count and ("Yes" or "No")
void print_result(int num) {
  // print count
  std::cout << count << std::endl;
  
  // print "Yes" or "No"
  if (num % 3 == 0) {
    std::cout << "YES" << std::endl;
  } else {
    std::cout << "NO" << std::endl;
  }
}


// main entry
int main() {
  std::string input = "";
  std::cin >> input;
  length = input.size();

  while(length > 1) {
    count ++;
    int sum = 0;

    sum = get_number(input);
    input = std::to_string(sum);
    length = input.size();
  }

  print_result(stoi(input));  

  return 0;
}

0개의 댓글