띠오니 개발자 성장일지
article thumbnail
반응형

안녕하세요.
취업을 했지만 실무를 하면서, 효율성과 가독성 떨어지는 코드를 보고 스스로 기초 개념이 부족하다고 느껴져 알고리즘 공부를 해야겠다 결심했습니다.
논리적인 생각이 잘 안되다 보니 소스코드도 길어지고 시간이 오래 걸리더라구요.
냄비 끓듯 금방 식을 열정 말고, 살살 스며들어 오래 공부할 수 있도록 노력해보려고 합니다.

 

 

참고한 도서는 Do it! 자료구조와 함께 배우는 알고리즘 입문(자바) 입니다.

http://www.yes24.com/Product/Goods/60547893

 

Do it! 자료구조와 함께 배우는 알고리즘 입문 자바 편 - YES24

IT 기업, 모든 시험에서 기초가 되는 자료구조와 알고리즘의 개념을 한 권에 모두 담았다!국내 IT 기업의 면접, 코딩 시험에서 중요하게 생각하는 역량 가운데 하나는 자료구조와 알고리즘이다.

www.yes24.com

참고로, 분철 옵션으로 구매하시면 좀 더 편하게 보실 수 있어요. 😄

 

 

 


 

1장 <기본 알고리즘>

  • 알고리즘의 개념
  • 소스코드의 실행 구조
  • 키보드로 사용자 입력 받기
  • 값의 대소 구분
  • 조건 판단과 분기

01-1. 알고리즘이란?

알고리즘 : 주어진 문제를 해결하기 위해 필요한 여러가지 단계들을 체계적으로 명시해놓은 것

컴퓨터를 이용해 주어진 문제를 해결하는 방법(알고리즘) 중 가장 효율적인 알고리즘을 찾는 것이 중요하다.

알고리즘이 가져야 할 7가지 주요 특성들

  • 입력 (input) : 문제를 풀기 위한 입력이 있어야 한다.
  • 출력 (output) : 문제를 해결했을 때 그 답이 나와야 한다.
  • 유한성 (finiteness) : 유한 번의 명령이 수행된 후에는 반드시 끝나야 한다.
  • 정확성 (correctness) : 주어진 문제를 정확하게 해결해야 한다.
  • 확정성 (definiteness) : 각 단계가 실행된 후에는 결과가 확정되어야 한다.
  • 일반성 (generality) : 같은 유형의 문제에 모두 적용될 수 있어야 한다.
  • 효율성 (effectiveness) : 정확하면서도 효율적이어야 한다.
    (김대수 저 <이산수학 Express> 참고)

 

 

순차적 구조와 선택적 구조

  • 순차적(concatenation) 구조 : 코드가 위에서부터 아래로 순차적으로 실행되는 구조
  • 선택적(selection) 구조 : 조건에 따른 결과에 따라 프로그램의 실행 흐름을 변경하는 구조
package chap01;
import java.util.Scanner;

class Max3 {
    public static void main(String[] args) {
        // 순차적 구조
        Scanner stdIn = new Scanner(System.in);

        System.out.println("세 정수의 최댓값을 구합니다.");
        System.out.print("a의 값:");    int a = stdIn.nextInt();
        System.out.print("b의 값:");    int b = stdIn.nextInt();
        System.out.print("c의 값:");    int c = stdIn.nextInt();
        int max = a;
        if (b > max) max = b;   // 선택적 구조
        if (c > max) max = c;

        System.out.println("최댓값은 " + max + "입니다.");
    }
}

[실습 1-1] Max3.java

 

 

Scanner : 키보드로 숫자와 문자열 입력하기

키보드로 어떤 값을 입력 받기 위해서는, 키보드와 연결된 표준 입력 스트림인 System.in 을 사용한다.
Scanner 객체의 변수 stdIn은 연결된 표준 입력 스트림에서 문자나 숫자를 꺼내는 장치 역할을 한다.

  • Scanner 클래스에 포함되어 있는 메소드
  • 범위는 next()와 nextLine() 외에 표기하지 않겠다. 기본 자료형의 범위와 동일하다.
메소드 자료형 입력값의 범위
nextBoolean() boolean  
nextByte() byte  
nextShort() short  
nextInt() int  
nextLong() long  
nextFloat() float  
nextDouble() double  
next() String 문자열(스페이스, 줄 바꿈 문자로 구분)
nextLint() String 문자열 1줄

 

 

 

메소드 매개변수 활용하기

public class Max3m {

    static int max3(int a, int b, int c){
        int max = a;
        if(b > max) max = b;
        if(c > max) max = c;

        System.out.println("max3 : " + max);
        return max;
    }

    public static void main(String[] args) {
        System.out.println("max3(3,2,1) = " + max3(3, 2, 1));
        System.out.println("max3(3,2,2) = " + max3(3, 2, 2));
        System.out.println("max3(3,1,2) = " + max3(3, 1, 2));
        System.out.println("max3(3,2,3) = " + max3(3, 2, 3));
        System.out.println("max3(2,1,3) = " + max3(2, 1, 3));
        System.out.println("max3(3,3,2) = " + max3(3, 3, 2));
        System.out.println("max3(3,3,3) = " + max3(3, 3, 3));
        System.out.println("max3(2,2,3) = " + max3(2, 2, 3));
        System.out.println("max3(2,3,1) = " + max3(2, 3, 1));
        System.out.println("max3(2,3,2) = " + max3(2, 3, 2));
        System.out.println("max3(1,3,2) = " + max3(1, 3, 2));
        System.out.println("max3(2,3,3) = " + max3(2, 3, 3));
        System.out.println("max3(1,2,3) = " + max3(1, 2, 3));
    }
}

[실습 1-2] Max3m.java

[연습문제 1-3]

 

 

 

세 값의 대소관계

세 값의 대소 관계의 조합은 13가지가 있다. 이 조합을 나열하면 나무 모양과 유사하다 하여 결정트리 라고 한다.

진행방향은 왼->오. 조건 성립하면 위, 성립하지 않으면 아래.
a,b,c 의 대소관계를 따져볼려고 그려봤는데, 쉬울 줄 알았는데 생각보다 헷갈렸다.

트리를 그리는 것과 같은 원리로 생각하면 된다. 중앙값이 무엇이 될지 케이스를 생각하는 게 시간이 좀 걸리긴 했으나

우선 똑같이 a와 b를 비교, b와 c를 비교, c와 a를 비교 하는 식으로 진행했다.

import java.util.Scanner;

public class Median {

    static int med3(int a, int b, int c){
        if(a>=b){
            if(b>=c) return b;
            else if(c>=a) return a;
            else return c;
        } else {
            // a<b
            if(a>c) return a;
            else if(b>c) return c;
            else return b;
        }
    }

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

        System.out.println("세 정수의 중앙값 구하기");
        System.out.print("a : "); int a = sc.nextInt();
        System.out.print("b : "); int b = sc.nextInt();
        System.out.print("c : "); int c = sc.nextInt();

        System.out.println("중앙값은 " + med3(a,b,c) + " 입니다.");
    }
}

[실습 1C-1] Median.java

public static void main(String[] args) {
    System.out.println("세 정수의 중앙값 구하기");

    System.out.println("med3(3,2,1) = " + med3(3, 2, 1));
    System.out.println("med3(3,2,2) = " + med3(3, 2, 2));
    System.out.println("med3(3,1,2) = " + med3(3, 1, 2));
    System.out.println("med3(3,2,3) = " + med3(3, 2, 3));
    System.out.println("med3(2,1,3) = " + med3(2, 1, 3));
    System.out.println("med3(3,3,2) = " + med3(3, 3, 2));
    System.out.println("med3(3,3,3) = " + med3(3, 3, 3));
    System.out.println("med3(2,2,3) = " + med3(2, 2, 3));
    System.out.println("med3(2,3,1) = " + med3(2, 3, 1));
    System.out.println("med3(2,3,2) = " + med3(2, 3, 2));
    System.out.println("med3(1,3,2) = " + med3(1, 3, 2));
    System.out.println("med3(2,3,3) = " + med3(2, 3, 3));
    System.out.println("med3(1,2,3) = " + med3(1, 2, 3));
 }

[연습문제4] 세 값의 대소 관계 13종류의 모든 조합에 대해 중앙값을 구하여 출력하는 프로그램

 

 

 

조건 판단과 분기

아래 코드에서 if문 중, 마지막 else if 문을 else 문으로 변경하면, 분기하는 모습이 다르다.
마지막에 3이 아닌 4나 -8이 입력 되어도, 출력은 이 수는 3 으로 된다.

즉, 원래 문장은 else 를 포함한 네 가지로 분기하지만, if(n==3) 을 생략한 문장은 세 가지로 분기 및 잘못된 결과를 출력하여 if문의 구조가 달라지므로 else if 문을 else 문으로 생략할 수 없다.

import java.util.Scanner;

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

        System.out.println("정수를 입력하세요.");
        int n = sc.nextInt();

        if(n==1)
            System.out.println("이 수는 1");
        else if(n==2)
            System.out.println("이 수는 2");
        else if(n==3)    
            System.out.println("이 수는 3");

    }
}
// else if(n==3) 을 else 로 바꾸면
if(n==1)
    System.out.println("이 수는 1");
else if(n==2)
    System.out.println("이 수는 2");
else 
    System.out.println("이 수는 3");
// 사실은 이렇습니다.
if(n==1)
    System.out.println("이 수는 1");
else if(n==2)
    System.out.println("이 수는 2");
else if(n==3)
    System.out.println("이 수는 3");
else
    ;        // 아무것도 하지 않음

 

 

 

연산자와 피연산자

  • 단항 연산자 : 피연산자 1개 ex) a++
  • 이항 연산자 : 피연산자 2개 ex) a>b
  • 삼항 연산자 : 피연산자 3개 ex) a ? b : c

자바의 조건 연산자 ? : 는 유일하게 삼항 연산자이다. a가 참이면 b, a가 거짓이면 c 를 출력한다.
잘 사용하면 if문 대신 조금 더 간략하게 사용 가능하다.

 

 

 

순서도 (flowchart)

  • 데이터(data) : 데이터의 입력과 출력
  • 처리(process) : 여러 종류의 처리 기능 수행. 연산이나 연산군 실행, 또는 몇가지 흐름 가운데 하나의 방향 결정하는 연산이나 연산군
  • 미리 정의한 처리(predefined process) : 서브루틴 및 모듈 등 다른 곳에서 이미 정의한 하나 이상의 연산 또는 처리
  • 판단(decision) : 하나의 입구와 하나 이상을 선택할 수 있는 출구, 정의한 조건을 판단해 출구 선택하는 판단 기능
  • 루프 범위(loop limit) : 두 부분으로 구성되어 루프의 시작과 종료 나타냄. 루프 이름과 함께 변수(i):초깃값,증갓값,종룟값 으로 표기

 

 

 

 


 

기본적으로 아는 내용이라  빨리 넘어가고 싶었지만, 기본이 가장 중요하다는 점을 계속해서 유의해야겠습니다.

자만하지말고 내일도 계속해서 공부해야겠다. 더 나은 내일을 위해 😊

읽어주셔서 감사합니다. 

 

 

반응형

 

 

반응형
profile

띠오니 개발자 성장일지

@띠오니

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!