본문 바로가기

공부기록/자료구조알고리즘

자료구조+알고리즘 1일차

자료구조 + 알고리즘 수업듣고 복습하고, 시간이 된다면 추가적으로 더 공부해서 올려보고 싶다.

오늘은 C언어에서 많이 쓰이는 for문, do~while문, 최댓값, 최솟값, 중앙값에 대해서 다시 공부하였다.

 

1일차 (23.07.27)


  1. 최댓값, 최솟값, 중앙값 구하기
    • 메인에 구현
    • 함수로 구분하여 구현
  2. while문을 이용하여 1~n까지의 합을 구해보세요.
  3. 정수 a,b를 입력받아서 a부터 b까지의 합을 구해봅시다.(for문 활용)
  4. 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