발자취

[백준 / C언어] Day27. 1 (4375) 본문

코딩테스트/Daily Coding (C, C++)

[백준 / C언어] Day27. 1 (4375)

해린 2024. 6. 30. 01:59

2024. 06. 30 - 코딩테스트 스터디 Day27

 

 

01. 문제

2와 5로 나누어 떨어지지 않는 정수 n(1 ≤ n ≤ 10000)가 주어졌을 때, 각 자릿수가 모두 1로만 이루어진 n의 배수를 찾는 프로그램을 작성하시오.

 

 

02. 입력

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, n이 주어진다.

 

 

03. 출력

각 자릿수가 모두 1로만 이루어진 n의 배수 중 가장 작은 수의 자릿수를 출력한다.

 

 

04-1. 예제 입력 1

3
7
9901

 

 

04-2. 예제 출력 1

3
6
12

 

 

05. 풀이 및 답

#include <stdio.h>

int main() {
    int n;
    
    while (scanf("%d", &n) != EOF) {
        int one = 1;
        int i = 1;
        
        while (1) {
            if (one % n != 0) {
                one = (one % n) * 10 + 1;
                i++;
            }
            else {
                printf("%d\n", i);
                break;
            }
        }
    }
    return 0;
}

n값이 입력될 때마다 one과 i값을 1로 초기화한다.

여기서 one은 각 자릿수가 모두 1로만 이루어진 수가 저장될 변수이고,

i는 각 자릿수가 모두 1로만 이루어진 n의 배수 중 가장 작은 수의 자리수이다.

 

while문을 돌면서,

one을 n으로 나눈 나머지가 0이 아니라면 one을 n으로 나눈 나머지 값에 10을 곱한 뒤 1을 더해주어 자릿수가 늘어난 '각 자릿수가 모두 1로만 이루어진 수'를 만든다. 그 뒤 i값에 1을 더해준다.

one을 n으로 나눈 나머지가 0이라면 그때의 i값을 출력하고 반복문을 빠져나간다.

 


 

이 문제를 풀이하면서 두 번의 큰 고비가 있었다.

 

☝🏻 첫 번째 고비 ☝🏻
최대 몇 개의 입력값이 들어오는지 모를 때의 처리 방법을 몰라 마주했다.
서치를 통해 EOF를 이용한 처리 방법을 사용하면 된다는 것을 알게 되었다.

아래와 같이 while문의 조건을 적으면, n값이 존재하는 동안 루프를 돌도록 만들 수 있다.
while (scanf("%d", &n) != EOF)​

 

✌🏻 두 번째 고비 ✌🏻
두 번째 고비는 one 값을 계산하는 과정에서 마주치게 되었다.

기존 작성 코드
우선 one % n이 0이 아닐 때 one을 계산하는 식을 아래와 같이 작성하였다.
단순히 보면 맞는 것 같지만, 이렇게 계산하도록 하면 예제 입력 세 번째 수인 '9901'을 입력했을 때 값이 너무 커진다는 문제가 있다.
몫은 한 번 나눠지면 계속 동일하게 나눠질 것이기 때문에 다음 단계에서는 몫을 제외한 나머지만 가지고 one을 계산하는 것이 합리적이라는 것을 알게 되었다.
one = one * 10 + 1;​


개선 코드
따라서 아래와 같이 코드를 작성해 줘야 '시간 초과' 결과가 뜨지 않는다!
one = (one % n) * 10 + 1;

 

 

 

정답!

 


어렵다

 

 

 

참고한 게시글

https://ip99202.github.io/posts/C%EC%96%B8%EC%96%B4-eof-%EC%B2%98%EB%A6%AC%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95/

 

C언어 eof 처리하는 방법

EOF? EOF는 end of file의 줄임말이다. 주로 이것은 백준 문제를 풀 때 최대 몇개의 입력이 들어오는지 모르는 문제에서 사용된다.

ip99202.github.io

https://hwangjiwon1.tistory.com/4

 

[C언어] 백준 | 4375번 1

https://www.acmicpc.net/problem/4375 #include int main(void) { int n, c = 1; long long num = 1; while (~scanf("%d", &n)) { // EOF 입력입니다. num = 1; c = 1; while (1) { if (num % n != 0) { num = (num % n) * 10 + 1; //여기가 함정 c++; } else { pr

hwangjiwon1.tistory.com