멘토링 (codeup 1089~1091 , 1093~1095) + 제곱수 문제
***수열 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;
}
오늘의 깨달은점
조건식 제대로해..