알고리즘  복잡도
복잡도(Complexity)
- 알고리즘 성능을 나타내는 척도
- 시간 복잡도: 알고리즘 필요 연산 횟수
- 공간 복잡도: 알고리즘 필요 메모리
- 시간 보갖ㅂ도와 공갑 복잡도는 trade-off 관계

자료구조 data structure
- 자료를 효율적으로 관리하기 위한 구조
- 관리: 저장, 삭제, 탐색 등
- 선형 자료구조: 배열, 연결리스트, 스택/큐/데크, 해시 테이블
- 비선형 자료구조: 트리, 그래프, 힙/우선순위 큐, 트라이

자료구조의 구현
- 추상자료형 adt: 자료 형태와 자료에 대한 연산을 정의한 것, 구체적인 구현 방법은 명시하지 않음 (*추상클래스, 인터페이스 참고)
- 대부분의 자료구조는 자바에서 클래스로 제공

배열
- 많은 수의 데이터를 다룰 때 사용하는 자료구조
- 각 데이터를 인덱스와 1:1 대응하도록 구성
- 데이터가 메모리 상에 연속적으로 저장됨
- 장점: 인덱스를 이용하여 데이터에 빠르게 접근 가느으
- 단점: 데이터의 추가/삭제가 번거로운 편(미리 최대 길이를 정해서 생성해야 함)

'오공완' 카테고리의 다른 글

231121 오공완  (0) 2023.11.21
231120 오공완  (0) 2023.11.21
231105 오공완  (0) 2023.11.05
231102 오공완  (0) 2023.11.03
231101 오공완  (0) 2023.11.02

- 선입선출(FIFO, First In First Out)

- 스택과 반대되는 개념

- 데이터가 입력된 시간 순서대로 처리해야 할 필요가 있는 상황에 이용

큐 연산

1. Enqueue: 큐 맨 뒤(rear)에 데이터 추가

- queue.add(), queue.offer()

2. Dequeue: 큐 맨 앞(front) 데이터 삭제

- queue.poll(), queue.remove()

3. peek(): queue의 첫번째 값 참조

 

스택

- 후입선출(LIFO, Last In First Out)

- 추상적 자료구조(ADT)

- 배열이 수직으로 쌓여있는 것

- 요소의 추가 및 삭제는 맨 위에서만 차례대로 가능

- ex) 웹 뒤로가기, ctr+z 실행취소 등

- push: 자료를 넣는 것 / pop: 넣어둔 자료를 꺼내는 것

 

스택 연산

- peek(): 스택의 가장 윗 데이터 반환 / 0(1)

- pop(): 스택의 가장 윗 데이터 삭제 / 0(1)

- push(): 스택의 가장 윗 데이터 자리 위에(top = top+1) 메모리 생성, 데이터 x 추가 / 0(1)

- empty(): 스택이 비어있으면 1, 그렇지 않다면 0 반환 / 0(1)

import java.util.Stack;

public class Solution {
    public static void main(String[] args) {
        // 스택 생성
        Stack<Integer> stack = new Stack<>();

        // 스택에 요소 추가
        stack.push(10);
        stack.push(20);
        stack.push(30);
        stack.push(40);

        // 스택 가장 위에 있는 요소 출력
        System.out.println("peek: " + stack.peek());

        // 스택 출력
        System.out.println("stack1: " + stack);

        // 스택 가장 위에 있는 요소 삭제
        System.out.println("pop: " + stack.pop());

        // 스택 가장 위에 있는 요소 삭제 후 스택 재출력
        System.out.println("stack2: " + stack);
    }
}

 

1. 집합

(1) 

2. 경우의 수

(1) 

3. 순열

- 순열(Permutation): 순서를 정해서 나열, 서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서O, 중복X)

- 중복 순열: 서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서O, 중복O)

- 원순열: 원 모양의 테이블에 n개의 원소를 나열하는 경우의 수

import java.util.stream.IntStream;

public class Permutation {
    public static void main(String[] args) {

        //1. 팩토리얼
        System.out.println("== 팩토리얼 ==");
        //5!
        int n = 5;
        int result = 1;

        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        System.out.println("result = " + result);
        //스트림으로도 구현
        //**reduce: 스트림의 요소를 하나씩 줄여가며 누적연산 수행
        System.out.println(IntStream.range(2, 6).reduce(1, (x, y) -> (x * y)));

        //2. 순열
        System.out.println("== 순열 ==");
        //5명을 3줄로 세우는 경우의 수
        n = 5;
        int r = 3;
        result = 1;

        for (int i = n; i >= n - r + 1; i--) {
            result *= i;
        }
        System.out.println("result = " + result);

        //3. 중복 순열
        System.out.println("== 중복 순열 ==");
        //서로 다른 4개의 수 중 2개를 뽑는 경우의 수(중복 허용)
        n = 4;
        r = 2;
        result = 1;

        for (int i = 0; i < r; i++) {
            result *= n;
        }
        System.out.println("result = " + result);
        //Math.pow(): 거듭 제곱 구하기
        System.out.println(Math.pow(n, r));

        //4. 원 순열
        System.out.println("== 원 순열 ==");
        //원 모양의 테이블에 3명을 앉히는 경우의 수
        n = 3;
        result = 1;

        for (int i = 1; i < n; i++) {
            result *= i;
        }
        System.out.println("result = " + result);

    }
}

 

조합

- 조합(Combination): 서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서X, 중복X)

- 중복 조합 : 서로 다른 n개 중에서 r개를 선택하는 경우의 수 (순서X, 중복O)

**combination 코드 구현 연습!! 숙달!!

//조합
public class Combination {

    static int getCombination(int n, int r) {
        int pResult = 1;
        for (int i = n; i >= n - r + 1; i--) {
            pResult *= i;
        }

        int rResult = 1;
        for (int i = 1; i <= r; i++) {
            rResult *= i;
        }

        return pResult / rResult;
    }

    public static void main(String[] args) {
        //1. 조합
        System.out.println("==조합==");
        //서로 다른 4명 중 주번 2 명 뽑는 경우의 수
        int n = 4;
        int r = 2;

        int pResult = 1;
        for (int i = n; i >= n - r + 1; i--) {
            pResult *= i;
        }

        int rResult = 1;
        for (int i = 1; i <= r; i++) {
            rResult *= i;
        }
        System.out.println("결과: " + pResult / rResult);

        //2. 중복 조합
        System.out.println("==중복 조합==");
        //후보 2명, 유권자 3명일 때 무기명 투표 경우의 수
        n = 2;
        r = 3;

        System.out.println("결과: " + getCombination(n + r - 1, r));

    }
}

 

점화식과 재귀함수

- 점화식(Recurrence): 어떤 수열의 일반항을 그 이전의 항들을 이용하여 정의한 식 ex.피보나치 수열

- 재귀함수: 어떤 함수가 자신을 다시 호출하여 작업을 수행하는 방식. 종료 조건 반드시 필요! 그렇지 않으면 무한루프에 빠짐

//점화식과 재귀함수
public class Recursion {

    //1, 3, 9, 27, ...의 n번째 수
    static int recursion1(int n) {
        if (n == 1) {
            return 1;
        }
        return 3 * recursion1(n - 1);
    }

    //1, 2, 3, 4, 5, 6, ...의 n번째까지의 합
    static int recursion2(int n) {
        if (n == 1) {
            return 1;
        }
        return n + recursion2(n - 1);
    }

    //1, 1, 2, 3, 5, 8, 13, ...의 n번째 수
    static int recursion3(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        return recursion3(n - 2) + recursion3(n - 1);
    }

    public static void main(String[] args) {
        int n = 5;
        System.out.println(recursion1(n));
        System.out.println(recursion2(n));
        System.out.println(recursion3(n));
    }
}

 

지수와 로그

//지수와 로그
public class Log {
    public static void main(String[] args) {
        //1. 제곱, 제곱근, 지수
        System.out.println("[제곱]");
        System.out.println(Math.pow(2, 3));
        System.out.println(Math.pow(2, -3));
        System.out.println(Math.pow(-2, -3));
        System.out.println(Math.pow(2, 30));
        System.out.printf("%.0f\n", Math.pow(2, 30));

        System.out.println("[제곱근]");
        System.out.println(Math.sqrt(16));
        System.out.println(Math.pow(16, 1.0 / 2));
        System.out.println(Math.pow(16, 1.0 / 4));

        System.out.println("[절대값]");
        System.out.println(Math.abs(5));
        System.out.println(Math.abs(-5));

        //2. 로그
        System.out.println("[로그]");
        System.out.println(Math.E);
        System.out.println(Math.log(2.718281828459045));
        System.out.println(Math.log10(1000));
        System.out.println(Math.log(4) / Math.log(2));
    }
}

 

알고리즘 복잡도

'공사중' 카테고리의 다른 글

무엇을 공부했나요 - 자바  (0) 2023.11.23
코딩테스트 입문  (0) 2023.11.10

프론트엔드란?

  • 사용자와 상호작용하는 인터페이스로 웹/모바일 서비스의 앞단
  • 주요 사용 언어: 자바스크립트 등

백엔드란?

  • 사용자가 원하는 정보를 제공할 수 있도록 데이터베이스나 서버를 관리하는 웹/모바일 서비스의 뒷단
  • 주요 사용 언어: 자바, 파이썬, C++, C# 등

 

백엔드 개발자가 되고 싶은 이유

  • 서비스의 핵심 기능과 데이터 관리를 책임지는 직무로 새로운 서비스를 만들거나 기능을 추가하는 분야라는 것에 흥미를 느낌

나머지 구하기

class Solution {
    public int solution(int num1, int num2) {
        int answer = num1%num2;
        return answer;
    }
}

숫자 비교하기

class Solution {
    public int solution(int num1, int num2) {
        int answer = 0;
        if (num1 == num2) {
            answer = 1;
        } else {
            answer = -1;
        }
        return answer;
    }
}

각도기

class Solution {
    public int solution(int angle) {
        int answer = 0;
        if (0 < angle && angle < 90) {
            answer = 1;
        } else if (angle == 90) {
            answer = 2;
        } else if (90 < angle && angle < 180) {
            answer = 3;
        } else if (angle == 180) {
            answer = 4;
        }
        return answer;
    }
}

짝수의 합

class Solution {
    public int solution(int n) {
        int answer = 0;
        for (int i = 0; i <= n; i++) {
            if (i % 2 == 0) {
                answer += i;
            }
        }
        return answer;
    }
}

배열의 평균값

import java.util.Arrays;

class Solution {
    public double solution(int[] numbers) {
        double answer = 0;
        for (int i = 0; i < numbers.length; i++) {
            answer += numbers[i];
        }
        return answer / numbers.length;
    }
}

양꼬치

class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        k -= n / 10;
        answer = 12000 * n + 2000 * k;
        return answer;
    }
}

편지

import java.util.Arrays;

class Solution {
    public int solution(String message) {
        int answer = 0;
        char[] arr = message.toCharArray();
        answer = 2 * arr.length;
        return answer;
    }
}

아이스 아메리카노

class Solution {
    public int[] solution(int money) {
        int[] answer = new int[2];
        answer[0] = money / 5500;
        answer[1] = money % 5500;
        return answer;
    }
}

피자 나눠 먹기(1)

class Solution {
    public int solution(int n) {
        int answer = 0;
        if (n % 7 == 0) {
            answer = n / 7;
        } else {
            answer = 1 + n / 7;
        }
        return answer;
    }
}

점의 위치 구하기

class Solution {
    public int solution(int[] dot) {
        int answer = 0;
        if (dot[0] >= 0 && dot[1] >= 0) {
            answer = 1;
        } else if (dot[0] < 0 && dot[1] >= 0) {
            answer = 2;
        } else if (dot[0] < 0 && dot[1] < 0) {
            answer = 3;
        } else if (dot[0] >= 0 && dot[1] < 0) {
            answer = 4;
        }
        return answer;
    }
}

배열 원소의 길이

class Solution {
    public int[] solution(String[] strlist) {
        int[] answer = new int[strlist.length];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = strlist[i].length();
        }

        return answer;
    }
}

중복된 숫자 개수

import java.util.Arrays;

class Solution {
    public int solution(int[] array, int n) {
        int answer = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] == n) {
                answer++;
            }
        }
        return answer;
    }
}

머쓱이보다 키 큰 사람

import java.util.Arrays;

class Solution {
    public int solution(int[] array, int height) {
        int answer = 0;
        Arrays.sort(array);
        for (int i = 0; i < array.length; i++) {
            if (array[i] > height) {
                answer++;
            }
        }
        return answer;
    }
}

짝수는 싫어요

class Solution {
    public int[] solution(int n) {
        int[] answer = new int[(n + 1) / 2];
        for (int i = 0; i < answer.length; i++) {
            if (i + 1 % 2 != 0) {
                answer[i] = 2 * i + 1;
            }
        }
        return answer;
    }
}

옷가게 할인 받기

class Solution {
    public int solution(int price) {
        int answer = 0;
        if (price >= 500000) {
            answer = (int) (price * 0.8);
        } else if (price >= 300000) {
            answer = (int) (price * 0.9);
        } else if (price >= 100000) {
            answer = (int) (price * 0.95);
        } else {
            answer = price;
        }
        return answer;
    }
}

@@@@@@

@@@@@@

@@@@@@

'공사중' 카테고리의 다른 글

무엇을 공부했나요 - 자바  (0) 2023.11.23
기초 수학  (0) 2023.11.13

다차원 배열

public class Main {
    public static void main(String[] args) {
        System.out.println("==일차원 배열==");
        int[] myArray = {1, 2, 3};
        System.out.println("myArray[1]= " + myArray[1]);
        for (int i = 0; i < myArray.length; i++) {
            System.out.println(myArray[i]);
        }
        for (int i : myArray) {
            System.out.println(i);
        }

        System.out.println("==이차원 배열==");
        int[][] myArray2 = {{1, 2, 3}, {4, 5, 6}};
        System.out.println("myArray2[1][2] = " + myArray2[1][2]);
        for (int i = 0; i < myArray2.length; i++) {
            for (int j = 0; j < myArray2[i].length; j++) {
                System.out.println(myArray2[i][j]);
            }
        }

        for (int[] ints : myArray2) {
            for (int anInt : ints) {
                System.out.println("anInt = " + anInt);
            }
        }
        
    }
}

컬렉션 프레임워크

import java.util.*;

public class Main{
    public static void main(String[] args) {
        //1. List
        //1-1. ArrayList
        ArrayList list1 = new ArrayList();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        System.out.println("list1 = " + list1);
        list1.remove(Integer.valueOf(2));
        System.out.println("list1 = " + list1);
        list1.add(0, 10);
        System.out.println("list1 = " + list1);
        System.out.println("list1.size() = " + list1.size());
        System.out.println("list1.contains(1) = " + list1.contains(1));
        System.out.println("list1.indexOf(10) = " + list1.indexOf(10));

        //1-2. LinkedList
        System.out.println("== LinkedList ==");
        LinkedList list2 = new LinkedList();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        System.out.println("list2 = " + list2);
        list2.addFirst(10);
        list2.addLast(20);
        System.out.println("list2 = " + list2);
        list2.remove(Integer.valueOf(1));
        System.out.println("list2 = " + list2);
        list2.removeFirst();
        list2.removeLast();
        System.out.println("list2 = " + list2);
        System.out.println(list2.size());
        
        //2. Set
        //2-1. HashSet
        System.out.println("== HashSet ==");
        HashSet set1 = new HashSet();
        set1.add(1);
        set1.add(2);
        set1.add(3);
        System.out.println("set1 = " + set1);
        set1.remove(1); //값으로 인식
        System.out.println("set1 = " + set1);
        set1.add(2);
        set1.add(3);
        System.out.println("set1 = " + set1); //중복처리 되어서 추가로 출력되지 않음
        System.out.println(set1.size());
        System.out.println(set1.contains(2));

        //2-2. TreeSet
        System.out.println("== TreeSet ==");
        TreeSet set2 = new TreeSet();
        set2.add(1);
        set2.add(2);
        set2.add(3);
        System.out.println("set2 = " + set2);
        set2.remove(2);
        System.out.println("set2 = " + set2);
        set2.clear();
        System.out.println("set2 = " + set2);
        set2.add(10);
        set2.add(5);
        set2.add(15);
        set2.add(15);
        System.out.println("set2 = " + set2);
        System.out.println(set2.first());
        System.out.println(set2.last());
        System.out.println(set2.lower(10));
        System.out.println(set2.higher(10));

        //3. Map
        //3-1. HashMap
        System.out.println("== HashMap ==");
        HashMap map1 = new HashMap();
        map1.put(1, "kiwi"); //키값과 데이터
        map1.put(2, "apple");
        map1.put(3, "mango");
        System.out.println("map1 = " + map1);
        map1.remove(2);
        System.out.println("map1 = " + map1);
        System.out.println("map1.get(1) = " + map1.get(1));

        //3-2. TreeMap
        System.out.println("== TreeMap ==");
        TreeMap map2 = new TreeMap();
        map2.put(10, "kiwi");
        map2.put(5, "apple");
        map2.put(15, "mango");
        System.out.println("map2 = " + map2);
        System.out.println(map2.firstEntry());
        System.out.println(map2.firstKey());
        System.out.println(map2.lastEntry());
        System.out.println(map2.lastKey());
        System.out.println(map2.lowerEntry(10));
        System.out.println(map2.higherEntry(10));

    }
}

'오공완' 카테고리의 다른 글

231120 오공완  (0) 2023.11.21
231115 오공완  (0) 2023.11.16
231102 오공완  (0) 2023.11.03
231101 오공완  (0) 2023.11.02
231031 오공완  (0) 2023.11.01

📓 Do it! 자바 프로그래밍 입문

자바 입출력과 스트림

1. 스트림

- 자바는 입출력 장치와 무관하고 일관성 있게 프로그램을 구현할 수 있도록 일종의 가상 통로인 스트림을 제공

- 자료를 읽어 들이려는 소스(source)와 자료를 쓰려는 대상(target)에 따라 각각 다른 스트림 글래스를 제공

- 입출력 기능: 파일 디스크, 키보드, 모니터, 메모리 입출력, 네트워크 등

2. 입력 스트림과 출력 스트림

- 스트림은 단방향으로 자료가 이동하기 때문에 입력과 출력을 동시에 할 수 없음

- 입력 스트림: InputStream이나 Reader로 끝나는 이름의 클래스

- 출력 스트림: OutputStream이나 Writer로 끝나는 이름의 클래스

3. 바이트 단위 스트림과 문자 단위 스트림

- 원래 자바의 스트림은 바이트 단위로 자료의 입출력이 이루어짐

- 자바에서 하나의 문자를 나타내는 char형은 2바이트이기 때문에 1바이트만 읽으면 한글 같은 문자는 깨짐

- 입출력 중 가장 많이 사용하는 자료인 문자를 위해 문자 스트림을 별도로 제공

- 바이트 스트림: Stream으로 끝나는 이름의 클래스

- 문자 스트림: Reader나 Writer로 끝나는 이름의 클래스

4. 기반 스트림과 보조 스트림

- 기반 스트림: 읽어들일 곳(소스)이나 써야할 곳(대상)에서 직접 읽고 쓸 수 있으며 입출력 대상에 직접 연결되어 생성되는 스트림

- 보조 스트림: 직접 읽고 쓰는 기능은 없으며 항상 다른 스트림을 포함하여 생성됨

자바 스트림 클래스 이름에서 스트림 특성 유추하기
ex)
FileInputStream
- InputStream = 입력 스트림
- Stream = 바이트 단위로 처리
- File = 직접 읽고 쓰는 기반 스트림

표준 입출력

1. Scanner 클래스

- java.util 패키지에 있는 입력 클래스

- 문자뿐 아니라 정수, 실수 등 다른 자료형도 읽을 수 있음

- 콘솔 화면뿐 아니라 파일이나 문자열을 생성자의 매개변수로 받아 자료를 읽어올 수 있음

- Scanner scanner = new Scanner(System.in)

예외 클래스

1. 오류와 예외

- 실행오류: 시스템 오류(error), 예외(exception)

- 오류는 프로그램에서 제어할 수 없지만 예외는 제어 가능

- 예외: 프로그램에서 파일을 읽어 사용하려는데 파일이 없는 경우, 네트워크로 데이터를 전송하려는데 연결이 안 된 경우, 배열 값을 출력하려는데 배열 요소가 없는 경우 등

- 오류 클래스는 모두 Throwable 클래스에서 상속받음

2. 예외 클래스의 종류

- 입출력 예외 처리(IOException)

- 실행 오류 예외 처리(RuntimeException)

'오공완' 카테고리의 다른 글

231115 오공완  (0) 2023.11.16
231105 오공완  (0) 2023.11.05
231101 오공완  (0) 2023.11.02
231031 오공완  (0) 2023.11.01
231030 오공완  (0) 2023.10.31

+ Recent posts