오늘은 이 2개를 복습하기 위한 글로 몇가지 예제를 풀어드리면서 이해를 돕고자 합니다.
예제 1 : 거꾸로 출력하기 3
주어진 문제를 보면 데이터의 개수가 n개가 들어온다 합니다. 몇개가 들어올지 입력을 받아야하므로, scanf 입력 함수를 사용하는것을 시작으로 합시다.
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
return 0;
}
ok! 그 다음 문제에서 요구하는걸 더 보겠습니다. n개의 데이터를 입력받았을 때, 이를 거꾸로 출력하라 합니다.
즉, 1,2,3,4,5 로 입력을 했다면 5,4,3,2,1 로 출력하는 것입니다. 변수가 여러 개이므로 저희는 반복문과 배열을 사용해야할 필요를 느낍니다.
소스코드 보죠.
#include <stdio.h>
int main()
{
int i,n;
scanf("%d",&n);
int num[n];
for (i=0; i<n; i++)
{
scanf("%d",&num[i]);
}
return 0;
}
이렇게 짜보았습니다. 일단 변수 i는 배열의 index를 의미하는 것으로 선언을 했습니다. 입력받을 데이터의 개수가 n일 때, 배열 num안에 들어갈 데이터 개수는 n개이므로, int num[n]으로 선언했습니다.
그 후, 반복문을 사용해서 배열 num에다 원소들을 입력받았습니다.
여기까지 이해가 되죠? 그 동안 봐온 글에서 벗어나지 않는 개념들로만 짠 것입니다. 이제 여기서 한번의 응용이 필요합니다.
입력까지는 다 받았는데, 이걸 어떻게 거꾸로 출력할 것인가?
3
.
.
.
2
.
.
.
1
.
.
.
해답 코드
#include <stdio.h>
int main()
{
int i,n;
scanf("%d",&n);
int num[n];
for (i=0; i<n; i++)
{
scanf("%d",&num[i]);
}
for (i=n-1; i>=0; i--)
{
printf("%d\n",num[i]);
}
return 0;
}
결과 화면
어렵지 않죠?
예제 2 : 10진수를 2진수로 변환하기
자, 이번꺼는 난이도가 살짝 있습니다.
10/2 = 몫 : 5 , 나머지 : 0
5/2 = 몫 : 2 , 나머지 : 1
2/2 = 몫 : 1 , 나머지 : 0
1/2 = 몫 : 0 , 나머지 : 1
따라서, 1010 (2진수로 표현한 10)이 됩니다.
이러한 원리를 바탕으로 C언어로 구현해보는 문제입니다.
그럼 먼저 생각을 해봅시다.
2진수로 변환하는 원리에 따르면 정수가 주어지면 그걸 계속해서 2로 나누는것 같다! 근데 몫이 0이 될때까지가 조건인듯하다!
나머지를 거꾸로 출력해야 한다. 0101이 아닌 1010으로 해야해!
#include <stdio.h>
int main()
{
int i,n = 0; // i는 배열의 인덱스, n은 입력받을 데이터을 0으로 초기화
scanf("%d",&n);
int num[100];
return 0;
}
Okay, 여기까지는 이제 무난하게 틀을 잡을 수 있죠? 데이터까지 입력을 받았어요. 그럼 이제 계속해서 2로 반복해서 나눌거에요. 단! 조건은 몫이 0이 될 때까지.
#include <stdio.h>
int main()
{
int i,n = 0;
scanf("%d",&n);
int num[100];
while(n>0)
{
??
}
return 0;
}
반복문을 사용해야하는 것까진 알았습니다. 근데 나머지값을 담아둘 공간이 필요합니다. 여기서 우린 배열을 생각해볼 수 있겠습니다.
#include <stdio.h>
int main()
{
int i,n = 0;
scanf("%d",&n);
int num[100];
while(n>0)
{
num[i] = n%2;
n=n/2;
i++;
}
return 0;
}
이렇게 말이죠. %는 나머지를, /는 몫만을 출력한다 배웠었습니다.
따라서, 배열 num의 원소들은 나머지들로 채우는게 맞습니다. 몫은 0이 될 때까지는 꾸준히 나눠지므로 n/2라는 변수값을 n이라는 변수상자에 넣는 식으로 반복하는 것이구요.
자, 우리 저렇게까지 짰는데 마지막 문제가 하나 잡혔습니다.
저 상태로해서 출력함수 printf를 아래처럼 짠다면,
while(n>0)
{
num[i]=n%2;
n=n/2;
printf("%d",num[i]);
i++;
}
2진수가 뒤집힌 상태로 출력이 됩니다. 예를 들어 10을 2진수로 표현하면 1010이 되야하는데 이 코드 상태로 출력을 돌리면 0101이 된다는 것이죠.
그래서, 우리는 이를 뒤집어줄 필요가 있습니다.
이거는 여러분들이 고민을 해보시길 바랍니다. 해답은 아래에 적어뒀습니다.
3
.
.
.
.
2
.
.
.
.
.
1
.
.
.
.
.
#include <stdio.h>
int main()
{
int i,n,size = 0;
scanf("%d",&n);
int num[100];
while(n>0)
{
num[i] = n%2;
n=n/2;
i++;
size++;
}
for (i=size-1; i>=0; i--)
{
printf("%d",num[i]);
}
return 0;
}
오늘의 숙제!
못풀어도 괜찮습니다. 최대한 할 수 있는데까지 구현해본 뒤, 해설코드를 구글링하여 찾아보시길 바랍니다. 그게 공부거든요 ㅎㅎ