자료구조 + 알고리즘 수업듣고 복습하고, 시간이 된다면 추가적으로 더 공부해서 올려보고 싶다.
오늘은 C언어에서 많이 쓰이는 for문, do~while문, 최댓값, 최솟값, 중앙값에 대해서 다시 공부하였다.
1일차 (23.07.27)
- 최댓값, 최솟값, 중앙값 구하기
- 메인에 구현
- 함수로 구분하여 구현
- while문을 이용하여 1~n까지의 합을 구해보세요.
- 정수 a,b를 입력받아서 a부터 b까지의 합을 구해봅시다.(for문 활용)
- 1~n까지의 합을 구해보세요. 단, n은 양수만 입력가능하게 검사 기능 추가
1. 최댓값, 최솟값, 중앙값 구하기 ( 함수로 구분하여 구현)
#include <stdio.h>
int max_num(int a, int b, int c){
int max=a;
if (max <= b){
max = b;
}
if (max <= c){
max = c;
}
return max;
}
int min_num(int a, int b, int c){
int min=a;
if (b <= min){
min = b;
}
if (c <=min){
min = c;
}
return min;
}
int mid_num(int a, int b, int c){
int maxnum=max_num(a,b,c);
int minnum=min_num(a,b,c);
int sum=a+b+c;
int result=sum-maxnum-minnum;
return result;
}
int main(void) {
int a,b,c;
printf("세 개의 정수를 입력해주세요:");
scanf("%d %d %d",&a, &b,&c);
printf("최댓값 : %d\n", max_num(a,b,c));
printf("최솟값 : %d\n", min_num(a,b,c));
printf("중앙값 : %d\n", mid_num(a,b,c));
return 0;
}
처음에 숫자 3개의 중앙값을 구할 때 for문을 활용해서
int mid3(int x, int y, int z){
if (x>=y){
if (y>=z)
return y; // x>y>z
else if (x<=z)
return x; // z>x>y
else
return z; // x>z>y
}
else if (x>=z)
return x; //y>x>z
else if (y>=z)
return z; // y>z>x
else
return y; // z>y>x
}
이런식으로 case를 계속 나눠서 반복문으로 구현할 수도 있겠다는 생각을 했는데 다른 방법으로 위에 mid_num 함수 처럼 세 개의 정수일 때 sum-max-min 방법으로도 구할 수도 있겠다는 걸 알게 되었다.
if ((b>=a && c<=a) || (b<=a && c>=a))
return a;
if ((a>=b && c<= b) || (a<=b && c>=b))
return b;
else
return c;
이런식으로 가독성을 조금 높게 하는 방법도 있지만 이런 방법은 같은 연산을 반복하는 꼴이라 효율적이지 못하다고 한다.
2.while문을 이용하여 1~n까지의 합 구하기
#include <stdio.h>
//while문 이용하여 1~n까지의 합을 구하라
int main(void){
int n;
int sum=0;
int i = 1;
scanf("%d",&n);
while (i<=n){
sum += i;
i++;
}
printf("%d",sum);
}
이건 가볍게 했는데 for문만 쓰다가 오랜만에 while문을 써봤다. while문 보다는 for문이 조금 더 간단하게 코드를 짤 수 있을거라 생각한다. do ~ while문이나 무한반복 코드를 구현하는 경우에는 while이 조금 더 효율적일지도
3. 정수 a,b를 입력받아서 a부터 b까지의 합 구하기(for문 활용)
#include <stdio.h>
// 정수 a,b를 입력받아서 a부터 b까지의 합을 구해봅시다.
int main(void){
int sum=0;
int a,b;
scanf("%d %d", &a, &b);
for (int i=a; i<=b; i++){
sum +=i;
}
printf("sum : %d",sum);
}
나는 처음에 입력 받을 때부터 그냥 작은 수, 큰 수 입력받도록 하면 될 것 같다고 생각했다. 근데 만약에 이걸 이용하는 사람이 큰 수 작은 수 입력할 수도 있으니까 그런 경우에는 그 최대 최소 검사해서 for문의 앞과 뒤만 잘 써주면 됨!
if(a<b){
min = a;
max = b;}
else{
min = b;
max = a;
}
그냥 이런거 중간에 껴주면 됨
4. 1~n까지의 합을 구하기 (단, n은 양수만 입력가능하게)
#include <stdio.h>
int main(void){
int n;
int sum=0;
int i = 1;
scanf("%d",&n);
if (n<0){
printf("양수만 입력해주세요");
} else{
while (i<=n){
sum += i;
i++;
}
printf("%d",sum);
}
}
그냥 n이 만약 음수로 입력되면 양수만 입력해달라고 프린트하고 끝나게 만들 수도 있지만 do~while문을 쓰면 n이 양수가 나올 때까지 반복할 수 있음.
#include <stdio.h>
int main(void){
int n;
do{
printf("n입력해줘");
scanf("%d",&n);
}while(n<=0);
int sum=0;
for (int i=1; i<=n;i++){
sum +=i;
}
printf("총합은 %d입니다",sum);
}
항상 sum 같은 변수 선언할 때 0으로 초기화하는 거 잊지말자 안그러면 쓰레기값 저장된다
사실 이 방법들 말고도 저번에 알고리즘 강의 들었을 때처럼 재귀함수 이용하여 1~n까지의 합 출력도 가능하다
https://tyvkwygk.tistory.com/12
public class Code03{
public static void main(String [] args){
int result = func(4);
System.out.print(result);
}
public static int func(int n){
if (n==0)
return 0;
else
return n + func(n-1);
}
}
자바 말고 c로 적용해보면
#include <stdio.h>
int sum_func(int n){
if (n==1)
return 1;
else
return n + sum_func(n-1);
}
int main(){
int n;
int sum;
int sum_func(int n);
printf("양수 n을 입력하세요 :");
scanf("%d", &n);
sum = sum_func(n);
printf("총 합 : %d",sum);
}
근데 이렇게 재귀함수 사용할 때는 꼭 n이 양수인지 아닌지 추가하는 코드를 같이 구현해야할 것 같다.
-1일차 끝-
'공부기록 > 자료구조알고리즘' 카테고리의 다른 글
자료구조+알고리즘 4일차 (0) | 2023.08.01 |
---|---|
자료구조+알고리즘 2일차 (0) | 2023.07.29 |