상세 컨텐츠

본문 제목

[백준] 1110번 더하기 사이클(c++)

프로그래밍/백준 c++

by montgras 2021. 7. 4. 23:58

본문

반응형

[문제] https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,

www.acmicpc.net

 

 

 


[풀이]

1. 두 자리 수 정수 하나를 입력 받는다.

2. 입력 받은 정수의 일의 자리 수가 십의 자리수가 되고,

2-1. 정수의 일의 자리 + 십의 자리의 일의 자리를 따와 다시 두자리 수 정수를 만든다.

3. 이때 만들어진 정수가 처음 입력받은 정수와 같다면 stop

 


말만 어렵다. 사실은 간단하고, 쉬운 문제로 관건은 풀이 2번의 식을 잘못 쓰지 않는 것이다. 나누고 곱하고 어쩌구의 방식이 복잡하다 보니, 사용자 정의 함수를 사용해 코드를 깔끔하게 구성하는 것이 더 괜찮겠다고 판단했다.

 

길이를 재는 것이고, 길이에 제한이 없기 때문에 for문 보다는 while문을 사용하는 것이 바람직하다.

 

#include <iostream>

using namespace std;
int ten(int);
int one(int);

int main() {
	int n;
	int cycle = -1; //정의 안했다가 오류 났다. 주의
	int cnt = 0;

	cin >> n;
	cycle = n;

	while (true) {
		if (cycle == n && cnt != 0) break;
        //조건은 while문을 처음 돌릴 때도 만족한다. 그러나 0은 원하는 값이 아니기에 추가 조건화
		//얘를 그냥 while문 조건 안에 넣어도 된다. 근데 보기 편하려고 따로 뺐다. 개인취향.
        
		cycle = 10 * one(cycle) + one(one(cycle) + ten(cycle));
		cnt++;
	}

	cout << cnt << endl;

	return 0;
}

int ten(int n) {
	return n / 10;
}
int one(int n) {
	return n % 10;
}

 

ten과 one은 입력받은 숫자의 십의 자리 숫자, 일의 자리 숫자를 반환해주는 함수이다.

물론 그냥 수식으로도 cycle을 표현할 수 있다. 그러나 수식을 바로 사용하는 방법은 괄호가 난무하고, 틀린 곳을 찾아내기 쉽지 않다. 그리고 ten의 경우, 입력받는 정수 n이 두 자리 수 정수이기 때문에 return n/10을 바로 사용할 수 있었다. 만약 아니었다면, 100으로 나머지 연산(%)을 한 후, /10을 진행하면 된다.

 

int ten(int n){
	return (n%100)/10;
}
//한 줄로 return 하려고 좀 복잡하게 적었다.

 

사칙연산 문제는 역시 사용자정의함수가 최고.

반응형

관련글 더보기

댓글 영역