Do it! 알고리즘 입문: 자바 편 (1)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

Do it! 알고리즘 입문: 자바 편 (1)[책리뷰 & Book review]

by Life & study 2024. 1. 29.
반응형

Do it! 알고리즘 입문: 자바 편 (1)

[책리뷰 & Book review]

 

 

IDC가 무엇인지 아는가?

IDC는 Internet Data Center의 약자로, 인터넷 관련 정보를 안전하게 보관하고, 관리하는 시설을 말합니다. 

IDC는 서버, 네트워크 장비, 데이터 저장 장치 등을 보관하고, 

이러한 장비들이 안정적으로 동작할 수 있도록 전력, 냉방, 보안 등의 인프라를 제공합니다.

IDC의 작동 방식은 아래와 같습니다.

사용자가 웹사이트에 접속 요청을 하면, 해당 요청은 IDC에 위치한 서버로 전달됩니다.
서버는 요청을 분석하여 필요한 데이터를 데이터베이스에서 찾아냅니다.
찾아낸 데이터를 바탕으로 웹페이지를 생성하고, 이를 사용자에게 전달합니다.
위의 과정을 간략하게 Java 코드로 표현하면 다음과 같습니다.

java

public class Server {
    Database db = new Database();

    public WebPage handleRequest(Request request) {
        // 요청 분석
        String dataNeeded = analyzeRequest(request);

        // 데이터베이스에서 필요한 데이터 찾아냄
        String data = db.findData(dataNeeded);

        // 웹페이지 생성
        WebPage page = createWebPage(data);

        // 생성한 웹페이지 반환
        return page;
    }
}


위의 코드는 매우 단순화된 예시이며, 실제 서버의 동작은 훨씬 복잡합니다. 또한, IDC는 단순히 서버의 동작을 지원하는 것이 아니라, 서버의 안정적인 운영을 위한 많은 추가적인 요소들을 제공합니다.

그림으로 표현하자면, 사용자의 요청이 IDC에 도착하여 서버를 거쳐 데이터베이스에서 필요한 정보를 찾아내고, 그 정보를 바탕으로 웹페이지를 생성하여 다시 사용자에게 전달하는 과정을 나타낼 수 있습니다. 물론 이 과정 중에는 보안, 냉방, 전력 등의 여러 인프라가 지원되어야 합니다.




 

 

 

시간 복잡도 정의
빅 -오메가의 연산 횟수
빅 -세타 연산 횟수
빅 - 오 최악일때 연산 횟수

 

컴퓨터 과학에서 시간 복잡도는 알고리즘의 실행 시간을 분석하는 것을 의미합니다. 

시간 복잡도를 표현할 때에는 보통 빅 오(Big O), 빅 세타(Big Θ), 빅 오메가(Big Ω) 표기법을 사용합니다.

이 세 가지 표기법은 모두 입력 크기 n에 대한 함수의 증가율을 나타냅니다.

빅 오(Big O): 알고리즘의 최악의 경우를 나타냅니다.

 즉, 입력 크기 n이 주어졌을 때, 알고리즘의 실행 시간이 이것보다 더 오래 걸리지 않을 것이라는 상한선을 설정합니다.

 

빅 세타(Big Θ): 알고리즘의 평균적인 경우를 나타냅니다.

 즉, 입력 크기 n이 주어졌을 때, 알고리즘의 실행 시간이 이 정도일 것이라는 예측을 제공합니다.

 

빅 오메가(Big Ω): 알고리즘의 최선의 경우를 나타냅니다. 

즉, 입력 크기 n이 주어졌을 때, 알고리즘의 실행 시간이 이것보다 빠르지 않을 것이라는 하한선을 설정합니다.


예를 들어, 선형 탐색 알고리즘을 생각해 봅시다.

선형 탐색 알고리즘의 시간 복잡도를 빅 오, 빅 세타, 빅 오메가로 표현하면 다음과 같습니다:

빅 오: O(n). 이는 최악의 경우, 즉 찾고자 하는 요소가 배열의 마지막에 있거나 배열 안에 없는 경우 모든 요소를 탐색해야 하므로 n번의 연산이 필요하다는 것을 의미합니다.

 

빅 세타: Θ(n). 선형 탐색의 평균적인 경우도 n/2번의 평균적인 탐색이 필요하므로 선형적으로 증가합니다.

 

빅 오메가: Ω(1). 이는 최선의 경우, 즉 찾고자 하는 요소가 배열의 첫 번째에 위치해 있는 경우 1번의 연산만으로 찾아낼 수 있다는 것을 의미합니다.
다음은 선형 탐색 알고리즘을 구현한 Java 코드입니다:

java

public int linearSearch(int[] array, int target) {
    for (int i = 0; i < array.length; i++) {
        if (array[i] == target) {
            return i;
        }
    }
    return -1; // target이 array에 없는 경우
}


위 코드에서 for 루프는 배열의 길이만큼 반복되므로, 

배열의 길이를 n이라고 할 때, 

선형 탐색 알고리즘의 시간 복잡도는 O(n), Θ(n), Ω(1)이 됩니다.

 


 



빅 오(Big O) : 최악의 경우를 의미합니다. 예를 들어, 배열에서 찾고자 하는 숫자가 배열의 마지막 요소 거나 배열에 없는 경우, 배열의 모든 요소를 검사해야 하므로, 이 경우의 시간 복잡도는 O(n)이 됩니다. 여기서 n은 배열의 길이를 의미합니다.
예시 코드:

for (int i = 0; i < n; i++) {
    if (array[i] == target) {
        return i;
    }
}


// 찾는 숫자가 없거나 배열의 마지막 요소인 경우, n번의 검사가 필요함
빅오

빅 세타(Big Θ) : 평균적인 경우를 의미합니다. 배열에서 찾고자 하는 숫자가 배열의 중간에 위치해 있다면, 평균적으로 n/2번의 검사를 해야 찾을 수 있습니다. 그러나 이 경우도 배열의 길이에 선형적으로 비례하므로, 시간 복잡도는 Θ(n)이 됩니다.
예시 코드:

for (int i = 0; i < n; i++) {
    if (array[i] == target) {
        return i;
    }
}


// 찾는 숫자가 배열의 중간에 위치해 있다면, 평균적으로 n/2번의 검사가 필요함
빅세타

빅 오메가(Big Ω) : 최선의 경우를 의미합니다. 예를 들어, 배열에서 찾고자 하는 숫자가 배열의 첫 번째 요소라면, 단 한 번의 검사만으로 찾을 수 있으므로, 이 경우의 시간 복잡도는 Ω(1)이 됩니다.
예시 코드:

for (int i = 0; i < n; i++) {
    if (array[i] == target) {
        return i;
    }
}


// 찾는 숫자가 배열의 첫 번째 요소인 경우, 1번의 검사만으로 찾을 수 있음
빅오메가

이렇게 빅 오, 빅 세타, 빅 오메가는 모두 알고리즘의 시간 복잡도를 나타내는 표기법이지만, 

알고리즘의 최악, 평균, 최선의 실행 시간을 각각 나타냅니다.

 

 

 

 

 

수정렬을 코딩테스트를 이해하기

 

.map

 

. sorted()

 

. toArray() 


. map(i -> inputNumbers [i]): 

map은 주어진 함수를 스트림의 각 요소에 적용한 결과로 구성된 새로운 스트림을 반환합니다.

 

 여기서 i -> inputNumbers [i]라는 람다 표현식을 사용하고 있으며, 

이는 i라는 입력을 받아 inputNumbers 배열의 i번째 요소를 반환하는 함수를 의미합니다. 

따라서 이 map 연산은 inputNumbers 배열의 요소들로 구성된 새로운 스트림을 생성합니다.


입력 스트림: 0, 1, 2, 3, 4 (0부터 N-1까지의 숫자들)

.map(i -> inputNumbers[i])
출력 스트림: 5, 2, 3, 4, 1 (inputNumbers 배열의 요소들)

 

. map() 메서드를 사용하는 코드입니다:

java

import java.util.Arrays;
import java.util.stream.IntStream;

public class Main {
    public static void main(String[] args) {
        int[] doubledNumbers = IntStream.range(0, 5)
                .map(i -> i * 2)
                .toArray();

        System.out.println(Arrays.toString(doubledNumbers));
    }
}

위의 코드를 실행하면, 출력 결과는 [0, 2, 4, 6, 8]입니다.

 

 

 

 

 

 



. sorted(): sorted는 스트림의 요소들을 기본 정렬 순서(오름차순)에 따라 정렬한 새로운 스트림을 반환합니다.

입력 스트림: 5, 2, 3, 4, 1
.sorted()
출력 스트림: 1, 2, 3, 4, 5 (오름차순으로 정렬됨)


. toArray(): toArray는 스트림의 모든 요소를 포함하는 배열을 반환합니다.

입력 스트림: 1, 2, 3, 4, 5
.toArray()
출력: [1, 2, 3, 4, 5] (배열)


이렇게 각 메서드는 스트림에 대해 특정 연산을 수행하고, 그 결과를 다시 스트림 또는 배열의 형태로 반환하는 역할을 합니다. 

이들 메서드를 연결하여 사용함으로써 여러 단계의 데이터 처리를 한 줄의 코드로 간결하게 표현할 수 있습니다. 

이런 방식을 '메서드 체이닝'이라고 부릅니다.


 

static IntStream concat(IntStream a, IntStream b)


첫 번째 스트림의 모든 요소와 두 번째 스트림의 모든 요소가 이어지는 지연 연결 스트림을 만듭니다.

 

 

static IntStream range(int startInclusive, int endExclusive)


의 증분 단계를 기준으로 (포함) IntStream에서 (제외)까지 순서 대로 정렬된 순차를 반환합니다. startInclusiveendExclusive1

 

 

 

 

static IntStream range(int startInclusive, int endExclusive)에 Inclustive가 무엇인가?

 

Inclusive는 포괄적이라는 뜻으로, 여기서는 시작 범위를 의미합니다.

startInclusive는 시작값을 의미하며, 이 값은 범위에 포함된다는 뜻입니다.

예를 들어, IntStream.range(1, 5)라고 하면, 이는 1부터 4까지의 정수 스트림을 생성합니다. 

여기서 1은 startInclusive에 해당하며, 이 값은 생성되는 스트림에 포함됩니다. 

반면에 endExclusive는 끝값을 의미하며

이 값은 범위에 포함되지 않습니다. 따라서 5는 스트림에 포함되지 않고, 1부터 4까지의 정수만 포함됩니다.

이런 방식은 프로그래밍에서 범위를 지정할 때 자주 사용되는 방식으로, 시작값을 포함하고 (inclusive) 끝값을 포함하지 않는 (exclusive) 방식을 사용합니다. 이는 인덱싱, 반복문 등에서 편리하게 사용될 수 있습니다.


 

 

Scanner scanner = new Scanner(System.in); 은 무엇인가?

 

Scanner 클래스는 Java의 내장 클래스 중 하나로, 여러 종류의 입력을 읽는 데 사용됩니다. 

특히, System.in을 매개변수로 받아 사용자로부터 키보드 입력을 받을 수 있습니다.

Scanner scanner = new Scanner(System.in); 

코드를 실행하면, Scanner 객체가 생성되고 System.in (표준 입력 스트림)이 연결됩니다.


사용자가 키보드로 데이터를 입력하면, 이 데이터는 먼저 키보드 버퍼에 저장됩니다.
scanner.nextInt()와 같은 메서드를 호출하면, 

Scanner는 버퍼에 있는 데이터를 읽어와 적절한 데이터 타입으로 변환합니다.


이렇게 변환된 데이터는 변수에 저장되거나 출력 등의 다음 동작에 사용됩니다.
아래는 이 과정을 도식화한 그림입니다.

[사용자] ---(키보드 입력)---> [키보드 버퍼] ---(Scanner 읽기)---> [Java 프로그램]


다음은 Scanner를 사용하여 키보드 입력을 받아 변수에 저장하는 간단한 Java 코드입니다.

java

import java.util.Scanner;

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

        Systehttp://m.out.print("숫자를 입력해주세요: ");
        int number = scanner.nextInt();

        System.out.println("입력하신 숫자는 " + number + "입니다.");
    }
}


이 코드를 실행하면 "숫자를 입력해 주세요: "라는 메시지가 출력되고

 사용자로부터의 입력을 기다립니다. 사용자가 숫자를 입력하고 엔터 키를 누르면,

 해당 숫자가 number 변수에 저장되고, "입력하신 숫자는 [입력한 숫자]입니다."라는

 메시지가 출력됩니다.

 

 

 

 

 

 

#알고리즘 #자바 #자바알고리즘 #정렬알고리즘 #알고리즘강좌 #알고리즘기초 #알고리즘뽀개기 #알고리즘공부 #알고리즘대회 #백준알고리즘 #두잇알고리즘 #알고리즘조합 #해시알고리즘 #알고리즘순열 #알고리즘기본 #js알고리즘 #재귀알고리즘 #두잇알고리즘 #알고

 

#자바 #자바프로그래밍 #자바프로그래밍입문 #자바입문 #doit #자바언어 #자바기초 #자바인강 #자바초보 #백준자바 #두잇자바 #자바스크립트 #자바기초강의 #자바강의 #자바독학 #자바설치 #it취업 #doit #doit! #doit! #자바스크립트

 

#알고리즘 #쇼츠알고리즘 #알고리즘뜻 #알고리즘뜻 #알고리즘강의 #알고리즘영상 #알고리즘공부 #알고리즘대회 #쇼츠알고리즘 #알고리즘만화 #알고리즘 4화 #유튜브알고리즘 #알고리즘투게더 #알고리즘원리 #알고리즘공부 #알고리즘강의 #알고리즘이란 #실전알고리즘 #지식

 

#코딩테스트 #카카오코딩테스트 #네이버코딩테스트 #삼성코딩테스트 #네카라쿠배코딩테스트 #코딩테스트 #코딩테스트준비 #삼성코딩테스트 #코딩테스트문제 #코딩테스트공부 #코딩테스트준비법 #코딩테스트공부 #코딩테스트풀이 #코딩테스트언어 #코딩테스트준비 #코딩테스트

 

 

 

 

 

반응형

댓글