강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

상훈님의 프로필 이미지
상훈

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-0 질문드립니다

작성

·

211

0

안녕하세요 선생님.

공유 소스 보기 (acmicpc.net)

위 링크는 선생님이 짜주신 코드 그대로입니다. 다름이 아니라

처음에 cnt가 1이므로 while문에 들어가면 else문에 의해서 cnt가 11이 되고

cnt %=n에 의해서 만약 n이 3이라고 가정을 하면 cnt = 2가 되는 것 아닌가요??

11 % 3 = 2니까요... 그러면 그 다음 cnt = cnt* 10 + 1에 의해서 cnt = 21이 된다고 생각하는데 왜 11, 111, 1111...이렇게 올라갈 수 있는지 모르겠습니다

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 상훈님 ㅎㅎ

상훈님 말씀처럼 당연히 2가 됩니다.

제가 디버깅 코드를 달아서 짠 코드를 드립니다. n 이 3일 때는 2, 0, 3이 찍히게 됩니다.

확인 부탁드려요 ㅎ

#include<bits/stdc++.h>
using namespace std;  
typedef long long ll; 
int n;
int main(){ 
	while(scanf("%d", &n) != EOF){
		int cnt = 1, ret = 1; 
		while(true){
			if(cnt % n == 0){
				printf("%d\n", ret);
				break;
			}else{
				cnt = (cnt * 10) + 1; 
				cnt %= n; 
				ret++;
			}
            cout << cnt << "\n";
		} 
	}  
	return 0;
} 
/*
2
0
3
*/

저거는 모듈러 연산 법칙을 이해하시면 되는데요.

우리가 결국 찾아야 하는 것은.

if(cnt % n == 0){

앞의 코드가 성립하는 수겠죠? 우리는 1, 11, 111을 만들어서 모듈러 연산을 해서 이 코드가 성립되게 만들수도 있지만. 저 수를 만들지 않고 계속해서 모듈러 연산을 해서 성립하게 할 수 있습니다.

cnt는 계속해서 더해서 만들어지는 수죠?

cnt = (cnt * 10) + 1;

이런식으로요.

모듈러 연산에 따르면

(a + b)% c = a % c + b % c

이 되기 때문에 계속해서 모듈러 연산을 했고 그 결과값으로.

if(cnt % n == 0){

이러한 걸 찾는게 성립이 되는 겁니다.

또한, 1 - O 해설 강의에도 해당내용을 자세하게 설명하고 있으니 참고부탁드립니다.

감사합니다.

 

상훈님의 프로필 이미지
상훈
질문자

네 이제 이해가 되네요 강의 너무 도움됩니다 감사합니다

상훈님의 프로필 이미지
상훈

작성한 질문수

질문하기