[백준 BOJ] 1769번 3의 배수 (C++/cpp)

2024. 12. 29. 00:59PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/1769

 

백준 BOJ 1769번 3의 배수 문제 사진1
백준 BOJ 1769번 3의 배수 문제 사진2

 

접근 방법 - 기초적인 문자열-숫자 변환 연산 문제

백준의 1769번 문제는 문자열과 숫자를 변형하는 연산을 통해 비교적 쉽게 해결할 수 있는 문제이다.

해당 문제는, 입력받은 숫자를 일련의 규칙을 통해 변환하는데, 숫자를 변환한 횟수와 입력값이 3의 배수인지에 대해 구하여 출력해야 하는 문제이다.

이때 일련의 규칙은 아래와 같으며, 이는 3의 배수들의 규칙과 연관이 있으니 문제 해결을 시도할 시 참고해두길 바란다.

- 두 자릿수 이상의 숫자라면, 각 자릿수의 숫자들을 모두 더한 숫자로 변환한다.
   (ex) 1234567 -> 1+2+3+4+5+6+7 = 28로 변환
- 한 자릿수의 숫자일 때 이 숫자가 3/6/9 중 하나라면, 변환되기 전의 숫자는 3의 배수라 할 수 있다.

위 규칙은, "어떤 숫자에 대해 각 자릿수 숫자의 합이 3의 배수라면, 이는 3의 배수라 할 수 있다"는 규칙을 활용한 것이다.

필자는 문자열-숫자 변환 함수를 활용하면서 위 규칙대로 문제 해결을 시도해 보았다.

자세한 설명은 아래에 기재해 놓으니, 혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면 아래의 설명과 코드를 참고해 보길 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 입력으로 주어지는 숫자(st)를 문자열로 입력받는다.

(각 자릿수 숫자들의 덧셈을 원활하게 수행하기 위함이다.)

 

2) 문제 지문에 제시된 규칙대로 숫자를 변환한 연산의 수행 횟수를 저장할 변수 count를 0으로 초기화한다.

그리고 위 방식의 변환을 진행하기 위하여, st의 각 자릿수 숫자의 총합을 저장할 변수 sum을 미리 선언해 둔다.

 

3) st의 자릿수가 2 이상이라면, 반복문을 활용하여 아래의 연산을 취한다.

- 각 자릿수의 숫자를 더하기 위하여, sum의 값을 0으로 초기화해 둔다.

- 다른 반복문을 수행하여, st의 각 자릿수의 숫자에 접근하도록 한다.

이때 sum에 각 자릿수의 숫자를 더하는데, 각 문자값에 대하여 '0'을 빼면서 숫자로 바꾼 상태에서 덧셈을 수행한다.

- 각 자릿수의 숫자 덧셈이 끝났다면, 숫자 변환 연산을 한번 수행한 것이라 할 수 있기 때문에 count에 1을 더한다.

- 한 자릿수가 되기 전까지는 위 연산을 이어야 하기 때문에, st에 현재 저장되어 있는 sum을 문자열 형태로 저장한다.

 

4) 위 반복문이 종료되었다면, 최종적으로 저장된 count의 값을 출력한다.

 

5) 입력으로 받은 수가 최종적으로 3의 배수인지를 파악하여 정답을 출력한다. 

현재 저장된 st가 "3"/"6"/"9" 중 하나라면 이는 3의 배수임을 뜻하기 때문에, "YES"를 출력한다.

다만, 위 조건문을 만족하지 못하였다면 이는 3의 배수가 아님을 뜻하기 때문에, "NO"를 출력한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <string>
#define endl '\n'
using namespace std;

//백준 1769번 코드
int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);	cout.tie(NULL);

	string st;
	cin >> st;

	int count = 0;
	int sum;
	while (st.length() >= 2) {
		sum = 0;
		for (int i = 0; i < st.length(); i++) {
			sum += st[i] - '0';
		}

		count++;
		st = to_string(sum);
	}

	cout << count << endl;
	if (st == "3" || st == "6" || st == "9") { cout << "YES" << endl; }
	else { cout << "NO" << endl; }
}

 

제출 결과

백준 BOJ 1769번 3의 배수 문제 C++ 제출 결과

(2023.01.07 백준 1769번 문제 제출 결과)

문제 지문이 장황하게 적혀있어서 헤맸던 흔적이 남아있다.

반응형