[C언어] #7. 예제 풀이 (3) _ 배열과 포인터

Crush_on_Study·2022년 6월 9일
0

C언어 기초

목록 보기
8/11
post-thumbnail

앞에서 1차원 배열 , 포인터 에 대해 배웠었습니다.

오늘은 이 2개를 복습하기 위한 글로 몇가지 예제를 풀어드리면서 이해를 돕고자 합니다.


예제 1

예제 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;
}

결과 화면

  • 데이터 개수 : 5개
  • 입력한 원소들 : 1 to 5
  • 출력된 결과 : 5 to 1

어렵지 않죠?


예제 2

예제 2 : 10진수를 2진수로 변환하기

자, 이번꺼는 난이도가 살짝 있습니다.

  • 음? 저 2진수가 뭔지 모르겠어요 : 2진수는 말 그대로 0과 1로만 이루어진 숫자입니다. 10진수 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이라는 변수상자에 넣는 식으로 반복하는 것이구요.

  • while문의 구조는 밖에 초기값을, 옆에 조건식을, 안에 증감식을 쓴다는 것. 잊지않으셨죠?

자, 우리 저렇게까지 짰는데 마지막 문제가 하나 잡혔습니다.
저 상태로해서 출력함수 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;
}


Assignment

오늘의 숙제!

예제 1. 소인수분해
예제 2. 평균 점수
예제 3. 기억력 테스트 1

못풀어도 괜찮습니다. 최대한 할 수 있는데까지 구현해본 뒤, 해설코드를 구글링하여 찾아보시길 바랍니다. 그게 공부거든요 ㅎㅎ

profile
방구석백수 코드몽키

0개의 댓글