발자취
[백준 / C언어] Day27. 1 (4375) 본문
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;

정답!

어렵다
참고한 게시글
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
'코딩테스트 > Daily Coding (C, C++)' 카테고리의 다른 글
| [프로그래머스 Lv.1 / C언어] Day29. 음양 더하기 (0) | 2024.07.02 |
|---|---|
| [백준 / C언어] Day28. 약수 (1037) (0) | 2024.07.01 |
| [백준 / C언어] Day26. 나머지 (10430) (0) | 2024.06.28 |
| [프로그래머스 Lv.1 / C++] Day25. 서울에서 김서방 찾기 (0) | 2024.06.28 |
| [프로그래머스 Lv.1 / C언어] Day24. 두 정수 사이의 합 (0) | 2024.06.27 |