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

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

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

by Life & study 2024. 2. 4.
반응형

 

 

 

N부터 M부터 배열의 순서의 이유는 무엇?



N은 입력받을 숫자의 개수를 나타내며, numbers 리스트에 숫자를 저장할 때 1부터 시작합니다. 이는 numbers 리스트의 0번째 인덱스에 0을 추가하고, 실제 숫자들은 1번째 인덱스부터 저장하기 때문입니다. 이렇게 하면 누적 합을 계산할 때 편리하게 범위의 합을 구할 수 있습니다. 예를 들어, getSum(start, end) 메서드에서 sum.get(end) - sum.get(start - 1)을 사용하여 범위의 합을 구하고 있습니다. 여기서 start - 1을 사용하는 이유는 sum 리스트에서 start 인덱스 이전까지의 누적 합을 빼기 위함입니다.

반면에 M은 쿼리의 개수를 나타내며, 이는 0부터 시작하는 for 루프를 통해 처리됩니다. 이는 일반적인 프로그래밍 관례로, 대부분의 프로그래밍 언어에서 배열이나 리스트의 인덱스는 0부터 시작하기 때문입니다. 따라서 M번의 쿼리를 처리하기 위해 0부터 M까지의 for 루프를 사용하는 것입니다. 이 경우에는 M이 특정 범위의 합을 구하는 쿼리의 개수를 나타내므로, M은 0부터 시작하고 N은 1부터 시작하는 것이 자연스럽습니다.

따라서 N과 M이 각각 1부터 시작하고 0부터 시작하는 이유는 그들이 코드 내에서 수행하는 역할과 관련이 있습니다. 이는 프로그래밍에서 흔히 볼 수 있는 패턴으로, 특정 문제를 해결하기 위한 방법 중 하나입니다. 이러한 방식은 문제의 요구사항과 프로그래밍 언어의 특성에 따라 달라질 수 있습니다.


 

백준 코드를 이해하는 방법

 

문제
수 N개가 주어졌을 때, i번째 수부터 j번째 수까지 합을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다. 둘째 줄에는 N개의 수가 주어진다. 수는 1,000보다 작거나 같은 자연수이다. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.

출력
총 M개의 줄에 입력으로 주어진 i번째 수부터 j번째 수까지 합을 출력한다.

 


문제파악하는 방법

 

예제 입력 1
5 3
5 4 3 2 1
1 3
2 4
5 5

--------------------------------------------
첫째 줄에 수의 개수 N, 

5 3 중 
5 4 3 2 1

-> 5 4 3 2 1


합을 구해야 하는 횟수 M

5 3 중 
3

------------------------------------------
조건 2: "둘째 줄에는 N개의 수가 주어진다."

5 4 3 2 1



----------------------------------------------
조건 3: "셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다."

이 조건은 세 번째 단계입니다. M개의 쿼리를 순서대로 처리합니다. 각 쿼리는 시작 인덱스 i와 종료 인덱스 j를 입력으로 받고, 이를 이용해 i부터 j까지의 숫자들의 합을 구합니다.

 

 

 

백준 문제를 파악하는 방법

 

첫째 줄에 수의 개수 N과 합을 구해야 하는 횟수 M이 주어진다.
   예제 입력: 5 3
   이는 숫자가 5개 있고, 3번의 쿼리(합을 구해야 하는 구간)가 있다는 것을 의미합니다.

 

이는 숫자가 5개 있고 = 배열이 5개

이는 숫자가 5개 있고 = 배열이 5개 중에 3번의 쿼리(합을 구해야 하는 구간)


2. 둘째 줄에는 N개의 수가 주어진다.
   예제 입력: 5 4 3 2 1
   이는 주어진 숫자들이 5, 4, 3, 2, 1이라는 것을 의미합니다.

 

둘째 줄에는 N개의 수가 주어진다

   예제 입력: 5 4 3 2 1 = 배열이 5개

 


3. 셋째 줄부터 M개의 줄에는 합을 구해야 하는 구간 i와 j가 주어진다.
   예제 입력: 

   1 3
   2 4
   5 5


   이는 첫 번째 쿼리에서 1번째부터 3번째 숫자까지의 합을 구하라는 것, 두 번째 쿼리에서 2번째부터 4번째 숫자까지의 합을 구하라는 것, 그리고 세 번째 쿼리에서 5번째 숫자만의 합을 구하라는 것을 의미합니다.

 

 


4. 출력
   예제 출력: 

   12
   9
   1


   이는 각 쿼리에 대한 결과로, 첫 번째 쿼리의 결과는 12, 두 번째 쿼리의 결과는 9, 세 번째 쿼리의 결과는 1입니다.

 

 

 

 

 

 

<쿼리> List 란 무엇인가?

 

<Query2>와 같이 제네릭 타입을 지정하려면, Query2라는 클래스가 미리 정의되어 있어야 합니다. <Query2>를 List의 제네릭 타입으로 지정하려면, Query2 클래스를 먼저 정의해야 합니다.

예를 들어, Query2 클래스를 아래와 같이 정의했다고 가정해 봅시다.

java

public class Query2 {
    private int value;

    // 생성자
    public Query2(int value) {
        this.value = value;
    }

    // getter 메소드
    public int getValue() {
        return this.value;
    }
}


이제 Query2 타입의 객체를 저장하는 List를 생성할 수 있습니다.

java

List<Query2> query2List = new ArrayList<>();
Query2 query2Instance1 = new Query2(5);
query2List.add(query2Instance1);
Query2 query2Instance2 = new Query2(10);
query2List.add(query2Instance2);


제네릭은 클래스나 메서드에서 사용할 내부 데이터 타입을 외부에서 지정하게 하는 기능입니다. Java의 List, Set, Map 등의 컬렉션 클래스들은 모두 제네릭을 사용하여 내부에서 다루는 데이터의 타입을 지정할 수 있습니다.



 

 

 

Lombok 라이브러리란 무엇인가?

 

 

@Data: 

 

이 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor를 한 번에 제공합니다. 즉, 클래스에 이 어노테이션을 지정하면 getter, setter, toString, equals, hashCode, 필요한 생성자를 자동으로 생성해 줍니다.


@AllArgsConstructor

 

이 어노테이션은 클래스의 모든 필드를 매개변수로 받는 생성자를 생성합니다.
장점: 모든 필드를 초기화하는 생성자를 자동으로 생성하므로, 생성자를 일일이 작성할 필요가 없습니다.

 

단점: 

일부 필드만을 초기화하는 생성자를 만들고 싶을 때는 적합하지 않습니다. 

이 경우에는 @RequiredArgsConstructor나 @NoArgsConstructor를 사용해야 합니다.

 


@Getter, @Setter

 

이 어노테이션은 각각 클래스의 모든 필드에 대한 getter, setter를 생성합니다.
장점: 필드에 대한 접근자(getter)와 변경자(setter)를 자동으로 생성하므로, 

이들 메서드를 일일이 작성할 필요가 없습니다.

 

단점: 모든 필드에 대해 메소드를 생성하기 때문에, 

일부 필드에 대해서만 메소드를 생성하고 싶을 때는 적합하지 않습니다.

 이 경우에는 각 필드에 직접 @Getter나 @Setter를 지정해야 합니다.

 


@Data
@AllArgsConstructor
public class Query {
    private int start;
    private int end;
}


위 코드는 아래와 같이 동작합니다:

@Data 어노테이션

으로 인해 Query 클래스에는 start와 end 필드에 대한 

getter, setter, toString, equals, hashCode 메서드가 자동으로 생성됩니다.


@AllArgsConstructor 어노테이션

으로 인해 Query 클래스에는 start와 end 두 매개변수를 받는 생성자가 자동으로 생성됩니다.

 

 

반응형

댓글