IT 프로그래밍/객체지향프로그래밍

명품 C++프로그래밍 11, 12 예제

기술1 2024. 3. 6. 19:55
반응형

#include <iostream>

using namespace std;

int main()
{
	int N = 0;
	int a, b, c = 0;

	cin >> N;

	int sum = 0;

	while (N > 0)
	{

	}

	return 0;
}

여기서 막혔습니다.

 

나머지를 구하는 10으로 나눈 다음 나머지를 알고 싶은데 그 나머지를 구하는 방법을 잘 모르겠습니다. 

 

#include <iostream>

using namespace std;

int main()
{
	int N = 0;

	cin >> N;

	int sum = 0;

	while (N > 0)
	{
		sum += (N % 10);
		N /= 10;
	}
	cout << "The sum is " << sum << endl;

	return 0;
}

이것이 정답인데 왜 이 코딩이 정답인지 100% 이해가 되지 않았습니다. 그래서 챗gpt를 통해 따라가보았습니다. 먼저 당연한 것들은 제외하고 

 

사용자로부터 변수 N을 선언하고 0으로 초기화를 해 주었습니다. while문으로 N이 0보다 클 때 반복하게 해주었는데요. sum에 N의 1의 자리 숫자를 더합니다. N을 10으로 나눈 나머지가 N의 1의 자리 숫자입니다. 

 

여기서 헷갈렸던 부분이 만약 N이 123이면 10으로 나눈 나머지는 12아닌가? 라는 의문이 들었는데요. 하지만 N % 10에 대해서 제가 잘 몰라서 그렇게 했습니다. 123 / 10 은 12가 되지만 123 % 10은 N의 일의 자리 숫자를 얻는 것입니다. 

 

%는 나머지를 구하는 것입니다. 만약 123을 10으로 나눴을 때 나머지는 3이 남으니 3을 배출해주는 겁니다. 

 

이런식으로


1. SUM += (123 % 10)에서 123 %10은 3이 되어서 sum에 더해집니다. 

2. 123 /= 10을 통해 N은 12가 됩니다.

3. sum += (12 % 10)은 2가 되어 sum에 더해집니다.

4. 12 /= 10을 통해 N은 1이 됩니다.

5. 마지막 루프에서 SUM += (1 % 10);은 1이 되어 sum에 더해집니다.

6. 1/= 10을 하면 N은 0이 되면서 루프는 종료되게 됩니다. 


코딩을 처음 접하는 저로써는 이 식도 어렵게 느껴졌지만 이것을 한번 보고 나니 이제 알 수 있을 것 같습니다. 코딩을 하면서 막히는 것에 원리를 이해하는 순간이 정말 짜릿하고 좋은 것 같습니다!!

 

내가 한 풀이

#include <iostream>

using namespace std;

int main()
{
	int N = 0;
	int count = 0;
	cin >> N;
	

	while (N >= 2)
	{
		N / 2 > 0;
		count++;
		
		N /= 2;
	}
	cout << "The 2 COUNT is " << pow(2,count) << endl;

	return 0;
}

이렇게 제가 생각하면서 한 방식은 이렇게 했습니다. 

while문을 사용해서 count++하는 방식으로 마지막에 pow를 통해 거듭제곱을 하는 방식을 했습니다. 하지만 풀이에 더 깔끔한 방식이 있었습니다.

 

여기서 제가 전에 봤지만 까먹었던 부분은 pow()함수였습니다. pow(2, 3) 이런 식으로 하면 2^3 = 8이런 식으로 되는 것을 볼 수 있습니다. 이처럼 pow를 사용해서 하는 법을 익힐 수 있었습니다. 

 

교수님 풀이

#include <iostream>

using namespace std;

int main()
{
	int N = 0;
	cin >> N;

	int p = 1;
	while (p * 2 <= N)
		p *= 2;

	cout << "The answer is " << p << endl;
	return 0;
}

이렇게 p^2 가 N보다 작거나 같을 때 계속해서 p*=2를 해주는 방식이 있었습니다. 이렇게 하면 문제가 풀어지는 것을 볼 수 있었습니다.  

 

제가 한 풀이와 차이점은 저 같은 경우는 while문을 통해 나눠가지고 그 값을 찾았다면 교수님의 풀이는 p라는 변수를 1로 둔 다음에 그 값을 계속에서 2를 곱하면서 N보다 최대한 차이가 작거나 같을 때까지 진해되었다는 것을 볼 수 있습니다. 교수님의 풀이가 직관적으로 더 와닿았던 것 같습니다. 

반응형