도전1) 10진수 정수를 입력받아서 16진수로 출력하는 프로그램을 작성해보자. 이는 서식문자의 활용에 대한 문제이므로 쉽게 해결할 수 있을 것이다.
#include <stdio.h>
int main(void){
int a;
scanf("%d",&a);
printf("%X", a);
}
서식문자를 알아야 한다. %x가 16진수의 표현법이라는 것을 알고 풀면 금방 나오는 문제이다.
도전2) 프로그램 사용자로부터 두개의 정수를 입력 받아서 구구단을 출력하는 프로그램을 작성해보자. 예를 들어서 프로그램 사용자가 3과 5를 입력하면 3단,4단, 5단을 출력되어야 하고, 2와 4를 입력하면 2단, 3단,4단이 출력되어야 한다.
단 한가지 조건이 있다. 사용자는 두개의 숫자를 입력할 때에 입력 순서에 자유로워야 한다. 즉 3과 5를 입력하건 5와 3을 입력하건 프로그램은 같은 결과를 출력해야 한다.
#include <stdio.h>
int main(void){
int a,b,temp;
scanf("%d %d", &a, &b);
if(a>b){
temp=a;
a=b;
b=temp;
}
for(int i=a;i<=b;i++){
for(int j=1;j<=9;j++){
printf("%d * %d = %d \n",i, j, i*j );
}
}
return 0;
}
구구단 문제이다.
일반적 구구단과 다른점은 순서 상관없이 보이는것은 작은것부터 출력을 해야한다는 점이다. 이를 위해 if 문을만들어서 temp 공간을 활용해 숫자를 바꿔주는 작업을 해 주었다. 이외에는 구구단 구하는 것과 같다.
도전3) 두개의 정수를 입력받아서 최대 공약수를 구하는 프로그램을 작성 해 보자
#include <stdio.h>
int main(void){
int a,b,temp,max;
scanf("%d %d", &a, &b);
if(a>b){
temp=a;
a=b;
b=temp;
}
for(int i=1;i<=a;i++){
if(a%i==0&&b%i==0){
max=i;
}
}
printf("%d", max);
return 0;
}
머릿속으로 그냥 푼거라 틀릴 수도 잇을 것 같다. 처음에 짜놓고 살짝의 수정을 거쳤다. 일단 입력을 받아서 for문을 돌린다. 단 공약수이기 때문에 작은 수를 판단해줘서 a 위치가 작은 수가 들어갈 수 있도록 해준다. 그리고 그만큼 반복을 시킨다. if문에서는 나누어 주는데 둘다 나머지가 0이 될 수 있는 부분이 있는데 그 부분마다 계속 max값을 설정해준다. 만약 최대인 경우에는 변하지 않을 것이므로 배열을 쓰지 않았다. 그리고 이것을 출력을 시킨다.
도전4) 필자가 좋아하는 것 중 하나가 금요일 저녁 퇴근길에 DVD나 만화채을 잔뜩 빌리고, 동네 슈퍼에 들려서 굿것질거리를 사가지고 집에 들어가는 것이다 오늘은 금요일이다. 현재 필자의 주머니에는 5천원이 있다. DVD 한편을 빌리면 3500원이 남는다. 슈퍼에 들려서 크림빵(500)원, 새우깡(700원), 콜라(400원)을 사려한다. 잔돈을 하나도 남기지 않고 이 세가지 물건을 하나 이상 구매하려면 어떻게 구매를 진행해야 하겠는가?
#include <stdio.h>
int main(void){
int c=500;
int s=700;
int d=400;
int i,j,k,money;
printf("현재 당신이 소유하고 있는 금액: ");
scanf("%d", &money);
for(i=1;i<money/c;i++){
for(j=1;j<money/s;j++){
for(k=1;k<money/d;k++){
if(money==c*i+s*j+d*k){
printf("크림빵 %d개 새우깡 %d개 콜라 %d개\n", i,j,k);
}
}
}
}
}
문제에 대해서 잘 이해를 못하기도 했고 이 원리가 왜 성립되는지 고민을 했었다. 일단 먼저 소유하는 것은 입력을 받는 것이 맞다. 그리고 각 경우에서 돈/각 물건의 가격을 나누어주었는데 반복 횟수를 세어주는 것이다. 이렇게 하면 횟수가 넘어 갈 수도 있는데 for문 3번째 if문에서 같을 경우에만 출력을 하게 하므로 큰 문제가 되지 않는다. for문만 똑같이 만들어주면 큰문제가 없는 문제였다.
도전5)10개의 소수를 출력하는 프로그램을 작성해보자. 참고로 정수num이 1과 num으로 밖에 나눠지지 않는다면 이는 소수에 해당한다. 따라서 3은 소수이다. 그러나 4는 소수가 아니다. 1,2,4로 나눠지기 때문이다.
#include <stdio.h>
int num[31];
int main(void){
for(int i=1;i<=31;i++){
for(int j=1;j<=i;j++){
if( i % j == 0){
num[i]++;
}
}
}
for(int i=1;i<=31;i++){
if(num[i]==2){
printf("%d ", i);
}
}
}
도전6) 프로그램 사용자로부터 초를 입력받은 후에 이를 [시,분,초]의 형태로 출력하는 프로그램을 작성해보자
#include <stdio.h>
int main(void){
int second;
scanf("%d", &second);
int h=second/3600;
int m=(second-h*3600)/60;
int s=(second-h*60)%60;
printf("%d시 %d분 %d초", h,m,s);
}
이문제는 분, 초 원리를 알면 쉬워진다. 일단 초를 입력받고 h,m,s를 통해 시,분,초 변수를 만들어 준다.
그리고 시 부분에서는 초에서 3600을 곱해야 하므로 이를 나누어준다. 분 부분에서는 이 부분을 second에서 빼준뒤 초와의 관계는 60이므로 이를 나누어준다. 마지막으로 초는 m부분 식에서 나머지를 구해주는 식으로 해주면 큰 문제가 생기지 않는다.
도전7) 프로그램 사용자로부터 숫자n을 입력받는다. 그리고 나서 다음 공식이 성립하는 k의 최댓값을 계산해서 출력하는 프로그램을 작성해보자
k
2 <=n
#include <stdio.h>
int main(void){
int n;
int i=0;
scanf("%d", &n);
while(n/2){
if(n/2==0){
break;
}
else{
n=n/2;
i++;
}
}
printf("%d", i);
}
약간 생각만 하면 쉽게 풀수 있는 문제였다. 횟수 제한은 숫자에 따라 달라지기 때문에 while을 이용해고 나눠준다. 끝까지 갔을경우에는 몫이 0이 될것이므로 이때 break가 되도록 하였고 그외인 경우에는 n의 값을 나누어주도록 하였다. 그리고 횟수를 1회 더해주도록 하였다. 그래서 break가 되면 얼마나 반복되었는지를 볼 수 있다.
횟수 i를 print해주면 된다.
도전8) 2의 n승을 구하는 함수를 재귀적으로 구현해보자. 그리고 그에 따른 적절한 main함수도 구현해보자. 참고로 재귀함수의 구현이 처음에느 어려운 편이기 때문에 여기서는 쉬운 문제를 제시하였다.
#include <stdio.h>
int main(void){
int i;
int n;
int total=1;
scanf("%d",&n);
for(i=0;i<n;i++){
total*=2;
}
printf("2의 %d는 %d", i,total);
}
여기서 중요한 것은 total을 꼭 1로 설정해야 하는 것이다. 그리고 for문을 이용해 확인하면서 2를 곱해준다. 출력을 해줄때에는 i와 total을 2를 곱한 것이므로 이를 출력시켜주면 된다.
도전프로그래밍 도장깨기!
도전프로그래밍 1 끝!!
'C language > 열혈C 문제풀이' 카테고리의 다른 글
[C] 열혈C 문제풀이 11-2 (0) | 2021.08.12 |
---|---|
[C] 열혈C 문제풀이 11-1 1번 (0) | 2021.08.12 |
[C] 열혈C 문제풀이 21-1, 21-2 (0) | 2021.08.10 |
[C] 열혈C 문제풀이 도전프로그래밍 2 (0) | 2021.08.07 |
[C] 열혈C 문제풀이 9-1 (0) | 2021.08.04 |