찹모찌의 기록일지
단계별로 풀어보기 3단계: 반복문 본문
네 반복문입니다.
반복문에서 중요한 변화를 겪었는데요.
제가 c++를 사용해서 풀고 있는데 저는 주로 cin과 cout을 이용해서 문제를 풀고 있었는데, 반복문부터는 scanf와 printf를 사용해서 풀게 되었습니다.
cin과 cout을 사용할 경우 속도가 느려서 시간 초과가 뜰 수도 있다고 하네요.
반복문 자체는 어려운 부분이 별로 없었는데요.
EOF에 대한 개념과 마지막 더하기 사이클 문제가 기억에 남아 소개해드리려고 합니다.
- 백준:10951 A+B -4
https://www.acmicpc.net/problem/10951
10951번: A+B - 4
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
www.acmicpc.net
이 문제는 여러 개의 테스트 케이스를 입력받다가 더 이상 입력이 이루어지지 않으면 프로그램을 종료하는 형식입니다.
여기서 중요한 부분은 더 이상 입력이 이루어지지 않는걸 어떻게 판단하느냐입니다.
저는 scanf가 입력(system call로 따지면 read)에 실패하면 -1을 반환하는 걸 토대로 EOF을 판단했습니다.
#include <iostream>
int main(void)
{
int a,b;
while(1)
{
int num=0;
num=scanf("%d %d",&a, &b);
if(num != -1)
printf("%d\n",a+b);
else
break;
}
return 0;
}
코드는 위와 같습니다. num이 scanf의 반환 값을 가지구요.
사실 if문에 바로 scanf를 넣어도 되는데 확실히 보여드리려고 변수를 하나 사용했습니다.
scanf가 잘 이루어지면 리턴 값이 입력받은 정수의 개수로 나옵니다. 위의 문제의 경우 2를 리턴하겠죠.
그러나 마지막에서 아무런 입력이 이루어지지 않으면 EOF 즉 -1을 반환합니다. 따라서 리턴 값이 -1이 아닌 경우에만 a+b의 값을 출력하게 됩니다.
마지막에 -1을 리턴 받으면 break를 통해 while문을 탈출하게 됩니다.
사실 scanf의 리턴 값에 대해서 자세히 알고 있지 않았었는데 이번 문제를 통해 아는 계기가 되었습니다.
매번 visual studio community를 쓰면 반환 값이 무시되었다는 오류가 떴었는데 이제 알았네요.😅
- 백준:1110 더하기 사이클
https://www.acmicpc.net/problem/1110
1110번: 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음,
www.acmicpc.net
사실 반복문 문제에서 제일 어렵지 않았나 생각이 드는 문제입니다.
각 자릿수를 이동시키면서 더하는 문제라 손 코딩하듯이 IDE의 도움을 받지 않고 풀기에는 머리가 많이 복잡해지는 문제였습니다.
#include <iostream>
int main(void)
{
int x;
int a, b;
int result;
int temp;
int count = 0;
scanf("%d", &x);
if (x < 10)
{
a = 0;
b = x;
}
else
{
a = x / 10;
b = x % 10;
}
while (1)
{
count++;
temp = a + b;
result = 10 * b + temp%10;
if (result == x)
break;
if (result < 10)
{
a = 0;
b = result;
}
else
{
a = b;
b = temp%10;
}
}
printf("%d\n", count);
return 0;
}
위의 코드로 풀었는데요. 일단 처음 받는 수 x가 10보다 작을 경우 10의 자리가 0 임을 감안해야 했기 때문에 해당 조건문을 작성해주었습니다. 이는 while문 안에서도 적용이 됩니다.
a는 b로 값을 넣어주고 b는 a와 b를 더한 값의 1의 자릿수를 넣어주는 식으로 반복문이 진행이 되었습니다. temp의 경우 1의 자리만 구해서 result로 나타내야 했기 때문에 10의 나머지를 구해주었습니다. 위와 같은 방식으로 result와 x가 같아지면 while문을 탈출할 수 있도록 했습니다.
while문 안에서 루프를 몇 번 도는지 세줄 count를 변수를 구하여 출력하면 완료입니다.
단계별로 진행하면서 점점 생각할게 많아지는 것 같습니다.
더 노력해보도록 하겠습니다.
'알고리즘' 카테고리의 다른 글
단계별로 풀어보기 4단계: 1차원 배열 (0) | 2022.07.28 |
---|---|
단계별로 풀어보기 2단계: 조건문 (0) | 2022.07.01 |
단계별로 풀어보기 1단계: 입출력과 사칙연산 (0) | 2022.07.01 |
안녕하세요. 찹모찌입니다. 알고리즘 공부를 시작할 계획입니다. (0) | 2022.06.30 |