백준 1110번 [더하기 사이클] - 풀이(이거 저만 어렵나요...)
문제.
난 이문제 완전히 틀림.
: 일단 문제만 보고 대충 어떤 방향으로 코딩할지는 못정했고 대충 십의 자리와 일의 자리를 가지고 구하는 건 알았다.
이미 이전 문제들을 통해 10의자리일 경우 N값/10 , 1의 자리일 경우 N값%10 여기까지만 알아도 충분했다.
반복문은 while문 사용 ㅡ> 정확한 반복횟수를 구할 수 없기에..
우선 나는 해볼 수 있는 데까지 코딩을 했다. 불나게 2시간 박은거 같다.... ( ㅠㅜ)
학창시절 나는 수학을 좋아는하지만 성적은 잘 안나오는 그런 애였다.
그래서 그런가 수학적 사고과 꽝이라 이런 문제들은 좀 힘든듯..(그럼 앞으로 다 힘들겠네 ㅇㅇ)
ㅇㅇ
ㅠㅜ
그래서 오기 내려놓고 풀이를 참고하기로 했다.(공책에 수식, 코드 써가며 열심히했다.. 할 수 있는데까진..)
근데 왠걸? 비슷비슷했다...
대충 참고한 블로그 링크를 남기고 풀이를 올리고 끝내겠다.
:https://daily-life-in-20s.tistory.com/23 근데 이분도 다른 분들걸 참고한...
풀이.
#include <stdio.h>
int main() {
int n, result;
scanf("%d", &n);
result = n;
// ^ 입력값
int a, b, r, sum;
int cnt=0;
//^ 변수
while(1){
a=(n/10), b=(n%10);
r=(a+b)%10;
sum=(b*10)+r;
n = sum;
//^ 수식
cnt++;
//^ 카운터
if(result==sum) break;
}
//break문 (입력값과 수식의 결과가 같을때 끝)
printf("%d", cnt);
return 0;
}
코드분석 :
a는 입력값의 10의 자리수의 앞부분
b는 입력값의 1의 자리수
r은 a+b의 합의 1의 자리수
예제로 살펴보자면 n=26 일때
2(a) + 6(b) = 8(a+b) -> {but. 여기서 (a+b)에 %를 해주는 이유는 8은 한자리수라 굳이 필요없지만 9(a) + 9(b) 같은 경우는
9(a) + 9(b) = 18(a+b)이므로 %나머지(1의 자리수)를 구해야만 답이 된다. 한마디로 예외를 없에 기 위해 8이 필요없다고 해도 %해줘야한다. 게다가 한자리수를 나눠봤자 나머지는 그대로 나온 다.(참고로 내가 틀린 이유 중 제일 큰 원인이 8을 10으로 나눈 나머지가 0인줄 알았다.<-ㄹㅇ바보}
60[(b)*10]+8 = 68(sum)
n = 68(sum)
이후 다시 반복..
한 번 반복할때 마다 카운터는 1씩 늘고, 수식에서 반복에 쓰일 입력값 n을 초반에 따로 result에
입력해줘서 안전하게 조건문까지 입력값(n = result)를 쓸 수 있다.
그래서 입력값과 수식의 값이 같아질때 이 반복문은 동작을 멈추고, 누적된 카운터 수를
출력하게 된다. 끝/.~~~~!!!
문제를 풀면서 확실히 느끼는건 구현문제나 뭐든지 수학이 제일 중요하다는 것이다.
난 수식을 제대로 공책에 썻고 코딩도 했지만 나머지값에서 실수가 난데다,
이후 수식을 어떻게 조건문까지 가져갈지 이게 반복이 분명 안되는데 했던 고민들이
(^ 이 고민은 result = n; 코드로 한방에 풀렸다. ㄷㄷ;;
내가 고민했던 수식의 마지막 코드를 분명 반복시킬려면 n을 넣어야하는데,
그러면 조건문을 쓸 수가 없다. 암튼 이건 풀이를 안봤으면 몇일은 걸렸을 것 같다.)
이게 브1인데 ㅠㅜ 앞으로 어카노...