멘토링 (codeup & 코딩도장 & 기타 문제)

멘토링 (codeup 1089~1091 , 1093~1095) + 제곱수 문제

HHH1 2021. 5. 3. 02:07

***수열 1

 

시작값 a 부터 늘어나는 수량 d 그리고 반복횟수 n 을 입력받아 n 번만큼 반복한 수를 출력하는 문제이다.

 

 

이 문제는 for 문을 사용해 풀면 쉽게 풀수 있다.

먼저 scanf 를 통해서 시작값 a 와 등차값(증가량) d 그리고 몇번째인지 n 을 입력받은 후

for의 i 변수에 조건식을 넣어서 n-1 번 반복할 수 있도록 해준다.

 

#include<stdio.h>

int main()
{
    int a,d,n;
    scanf("%d %d %d",&a,&d,&n);
    
    for (int i=1 ; i<n ; i++)
            {
                a+=d;
            }
    printf("%d",a);
    
    return 0;
}

 

위의 i 의 초기값을 1 로 설정한 이유는 0으로 설정하게되면 n번 반복하는 꼴이 되어 버리기에, n번째 라는 뜻과는 조금 다르게된다. 예를 들어 1 2 3 이 있을때 2는 2번째가 아니라 반복 횟수, 즉 2가 1번 이 되는 것이다.

따라서 n-1 번을 해야 식이 성립한다.

 

***수열 2

 

 

이번엔 등차가 아닌 등비로 비율이 같은 숫자들을 a 부터 n-1 번 반복한 수를 찾으면 된다. 

단 등차수열은 수가 엄청 커질 수 있기에 int 대신 long long 으로 해결하자. long long 형의 입력형식자는 %lld 이다.

#include<stdio.h>

int main()
{
    long long a,r,n;
    scanf("%d %d %d",&a,&r,&n);
    
    for (int i=1 ; i<n ; i++)
            {
                a*=r;
            }
    printf("%lld",a);
    
    return 0;
}

 

***수열3

 

이전과 똑같은 베이스로, 달라지는건 시작값인 a 를 받고, 순서대로 m 을 곱하고 , d 를 더해주면 된다.

 

#include<stdio.h>

int main()
{
    long long a;
    int m , d , n;
    scanf("%lld %d %d %d",&a,&m,&d,&n);
    
    for (int i=1;i<n;i++)
        {
            a*=m;
            a+=d;
        }
    
     printf("%lld",a); 
     
    return 0;
}

단, a 는 크기가 int 의 범위를 넘어서는 크기를 받을 수 있기에 long long 형으로 선언해준다.

 

***이상한 출석 부르기 (배열)

 

이번 문제는 배열을 이용한 문제로 번호를 총 부를 횟수 n과 출석번호를 t 반복적으로 받아서 n번동안 어떤 t 를 몇번 입력했는지를 쭉 나열해서 출력하는것이 목표이다.

 

#include<stdio.h>

int main()
{
    int n , i , t;
    int a[24]={};
    scanf("%d",&n);
 
        for (i = 1; i <= n; i++)
        {
            scanf("%d",&t);
            a[t]=a[t]+1;
        }
        
        for (i=1;i<=23;i++)
        {
        printf("%d ", a[i]);
        }
    return 0;
}

for 문으로 t 를 입력받는 부분을 감싸서 t 를 계속 입력받아줍니다. a[t]=a[t]+1 를 하는 이유는 예를 들어서 a[1] 을 입력받았을때 a[1] 은 1번 입력받았다는 뜻으로 a[1]에 1 을 더해준다는 뜻이다. int a[24]={}; 를 선언할때 24는 배열은 0부터 시작하기에 1~23 을 만족하려면 24로 써야한다. 꼭 써야하는건 아니지만 보기 편하기 위해..

배열 헷갈린다.!

 

*** 출석부르기 2

 

 

이번에는 위에서 부른 출력값을 반대로 출력하면된다. 방법은 부른번호를 i 를 점점 감소하게 만들어서 뒤에서부터 저장해서 순서대로 출력하면 된다.

 

#include<stdio.h>

int main()
{
    int n , i , t;
    scanf("%d",&n);
    int a[n]={};
    
        for (i = n; i > 0; i--)
        {
            scanf("%d",&t);
            a[i]=t;
        }
        
        for (i=1;i<=n;i++)
        {
        printf("%d ", a[i]);
        }
    return 0;
}

단, 코드는 항상 위에서부터 적용되므로 a[n]={}; 은 scanf() 밑에 써준다.

위에 쓸경우 새로 입력받은 n 값을 넣어줄수 없기에 코드가 정상작동하지 않는다.

 

***출석부르기 3

 

 

이번에는 무작위로 부른 번호 중 가장 낮은번호를 출력하는 문제이다.

 

#include<stdio.h>

int main()
{
    int n , i , t , s=23;
    int a[24]={};
    scanf("%d",&n);
 
    
        for (i = 1; i < n; i++)
        {
            scanf("%d",&t);
            a[i]=t;
        }
        
        for (i=1;i>=n;i++)
        {
            if (a[i]<s&&a[i]>0)
                s=a[i];
        }
        printf("%d ", s);
        
    return 0;
}

  두번째 for 문에서 i>= n 부분에서  for 문을 실행 시키지 않았기에 실행이 안됐다.

그리고 scanf() 에 &t 대신 &a[i] 로 바꿔서 정리해줬다. 항상 조건식을 조심할것!

#include<stdio.h>

int main()
{
    int a[24] = {};
    int n, t ;
    scanf("%d", &n);


    for (int i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
    }
    int s = a[0];
    for (int i = 0; i < n; i++)
    {
        if (a[i] < s )
            s = a[i];
    }
    printf("%d ", s);
    
    return 0;
}

 

오늘의 깨달은점 

 

조건식 제대로해..