본문 바로가기

알고리즘 자료구조

[자료구조와 함께 배우는 알고리즘 입문] 1. 기본 알고리즘

728x90

1. 알고리즘이란?

 

1-1 세 값의 최댓값 구하기

public class Max3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();

        int max = a;
        if(max<b){
            max = b;
        }
        if(max<c){
            max = c;
        }
        System.out.println("최댓값: "+max);


    }
}

이 문제를 해결하기 위해서는

1) 세 값을 Scanner로 입력 받은 다음 하나를  max로 임시 지정한다.

2) max값과 남은 두 값을 비교하면서 max값을 변경해 최대값을 출력하면 된다.(if문 사용)

 

이 문제는 여러 프로세스가 순차적으로 실행되는 구조인 순차구조와 if문으로 판단해서 프로그램의 실행 흐름을 변경하는 선택 구조로 이루어진다.

 

main 메소드 안에서 작성하는 것 외에 메소드를 작성해서도 구현이 가능한데, 아래 코드와 같이 구현하면 된다.

 

public class Max3 {

    static int max3(int a, int b, int c){
        int max = a;
        if(max<b){
            max = b;
        }
        if(max<c){
            max = c;
        }
        return max;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("최댓값: "+max3(sc.nextInt(),sc.nextInt(),sc.nextInt()));

    }
}

 

최소값을 구하는 경우에는 대소관계를 반대로 해서 코드 작성해주면 된다.

static int min3(int a, int b, int c){
        int min = a;
        if(min>b){
            min = b;
        }
        if(min>c){
            min =c;
        }
        
        return min;
    }

 

 

중앙값을 구하는 경우에는 아래와 같이 대소관계를 비교해서 최대값보다 작고, 최소값보다는 큰 값을 구해주면 된다.

static int median(int a, int b, int c) {
        if (a >= b && a <= c || a <= b && a >= c) {
            return a;
            //a가 b보다 크고 c보다 작은 경우 혹은 a가 b보다 작고 c보다 큰 경우 중앙값은 a
            
        } else if (b >= a && c <= b || b <= a && c >= b) {
            return b;
            //b가 a보다 크고 c보다 작은 경우 혹은 b가 a보다 작고 c보다 큰 경우 중앙값은 b
            
        } else {
            return c;
            //위 경우가 아니라면 중앙값은 c
            
        }
    }

 

 

 

1-2 조건 판단과 분기

 

입력한 정수가 양수인지, 음수인지, 0인지를 판단하는 코드다.

import java.util.Scanner;

public class JudgeSign {
    static void judge(int x){
        if(x>0){
            System.out.println(x+"= 양수");
        }else if(x<0){
            System.out.println(x+"= 음수");
        }else{
            System.out.println(x+"= 0");
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        judge(sc.nextInt());
    }
}

 

 

 

2. 반복

 

2-1. 1부터 n까지의 정수 합 구하기

반복문은 for문이나 while문으로 작성하면 된다. 먼저 while문으로 정수 합 구하는 코드를 작성해보겠다.

public class SumLoop {
    static int sumWhile(int x){
        int sum = 0;
        int i=1;
        while(i<=x){
            sum+=i;
            i++;
        }
        return sum;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sumWhile(sc.nextInt()));
    }
}

 

for문으로 작성하면 아래와 같다.

import java.util.Scanner;

public class SumLoop {
	static int sumFor(int x){
        int sum=0;
        for (int i = 1; i <=x ; i++) {
            sum+=i;
        }
        return sum;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println(sumFor(sc.nextInt()));
    }
}

(개인적으로 이런 반복문은 for문이 훨씬 편함 이유 모르겠음 ㅎㅎ...그냥 나의 느낌으로....for문이 이런거는 훨씬 편해유)

 

 

2-2. 양수만 입력받아 1부터 n까지의 합 구하기

이 문제는 do while 문을 이용해 코드를 작성하면 된다.

public class SumLoop2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x;

        do {
            x = sc.nextInt();
        }while (x<=0);

        int sum=0;
        for (int i = 1; i <=x ; i++) {
            sum+=i;
        }
        System.out.println("합계: "+sum);

    }
}

do while문은 while안에 조건을 넣어서 해당 조건을 만족할 동안 do 안에 있는 코드를 실행한다.

while문의 조건을 만족하지 못하면 반복은 종료되게 된다.

 

 

2-3. 반복 과정에서 조건 판단하기

양수 n을 입력받고 1부터 n까지 합을 구하는 과정을 출력한다.

import java.util.Scanner;

public class SumVerbose {
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        int n;
        do{
            n = sc.nextInt();

        }while (n<=0);
        
        int sum=0;

        for (int i = 1; i <=n ; i++) {
            if(i==n){
                System.out.print(i+" = ");
            }else{
                System.out.print(i+" + ");
            }
            sum+=i;
        }
        System.out.println(sum);
    }
}

 

 

2-4. 다중 루프 다루기

중첩 루프로 직각이등변삼각형 별찍기를 하는 코드는 아래와 같다.

import java.util.Scanner;

public class Triangle {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();

        for (int i = 1; i <= x; i++) {
            for (int j = 0; j < i; j++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

높이를 스캐너로 입력받고 i쪽 for문으로 높이를 쌓아주고, j쪽 for문으로 가로쪽으로 * 찍어주면 된다.

 

 

 

 

[마무리]

자바 기본 문법, 반복문 조건문 정도만 알면 간단하게 해결할 수 있는 문제들이었다.

책의 목차를 보면 2강까지는 비교적 쉬운 파트일거라고 생각돼서 빠르게 공부하려고 한다.

이 책을 다음주 안으로 빠르게 회독하고 이 책보다 좀 더 어려운 책으로 알고리즘과 자료구조를 공부하려고 한다.

다음주까지 입문 달려보자구

728x90