✏️오늘의 문제
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascal = new ArrayList();
pascal.add(1);
if (rowIndex == 0) {
return pascal;
}
long val = 1;
for (int i = 1; i < rowIndex; ++i) {
val = (val * (rowIndex - (i - 1))) / i;
pascal.add((int) val);
}
pascal.add(1);
return pascal;
}
}
Pascal의 삼각형은 조합론에서 중요한 수학적 구조로, 각 행의 값은 이항 계수로 구성됩니다. 이 글에서는 주어진 행 인덱스에 해당하는 값을 계산하는 Java 메서드를 소개합니다.
아래의 Java 코드는 특정 행의 값을 효율적으로 계산하여 리스트 형태로 반환하는 getRow
메서드를 구현하고 있습니다.
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascal = new ArrayList();
pascal.add(1);
if (rowIndex == 0) {
return pascal;
}
long val = 1;
for (int i = 1; i < rowIndex; ++i) {
val = (val * (rowIndex - (i - 1))) / i;
pascal.add((int) val);
}
pascal.add(1);
return pascal;
}
}
클래스 및 메서드 정의
Solution
클래스 내에 getRow
라는 메서드를 정의합니다. 이 메서드는 rowIndex
를 입력으로 받아 해당 행의 값을 반환합니다.리스트 초기화
ArrayList
인 pascal
을 생성하고, 첫 번째 요소로 1을 추가합니다. 모든 행은 1로 시작하므로 초기값으로 추가하는 것입니다.첫 번째 행 처리
rowIndex
가 0일 경우, 즉 첫 번째 행을 요청하는 경우에는 이미 리스트에 1이 추가되어 있으므로 그 값을 반환합니다.값 계산을 위한 변수 선언
long
타입의 val
변수를 선언하여 각 요소의 값을 계산하는 데 사용합니다. long
을 사용하는 이유는 큰 수의 계산에서 오버플로우를 방지하기 위함입니다.Pascal의 삼각형 값 계산
for
루프를 통해 1부터 rowIndex
까지 반복하며 각 요소의 값을 계산합니다. val
은 조합 공식을 사용하여 업데이트되며, 이는 C(rowIndex, i)
를 구하는 방식입니다. 이 과정을 통해 현재 행의 각 요소를 계산하고 리스트에 추가합니다.마지막 요소 추가
결과 반환
pascal
을 반환합니다.이 코드의 장단점은 다음과 같습니다.
효율성
메모리 사용 최적화
long
타입 변수를 사용하여 큰 수의 오버플로우를 방지합니다.간결함
유연성
rowIndex
에 따라 동적으로 결과를 생성하므로, 다양한 행의 값을 쉽게 계산할 수 있습니다.long
타입 사용
long
타입을 사용하더라도, 매우 큰 행 인덱스에 대해서는 여전히 오버플로우가 발생할 수 있습니다. 예를 들어, rowIndex
가 34 이상인 경우, 이항 계수의 값이 int
범위를 초과할 수 있습니다.리스트의 최종 크기
인덱스 오류 가능성
for
루프의 조건이 i < rowIndex
로 설정되어 있어, rowIndex
가 0일 경우에는 실제로 값을 계산하지 않지만 명시적으로 처리한 후에 1을 추가함으로써 혼동할 수 있습니다. 이는 코드 이해에 있어 약간의 불명확성을 줄 수 있습니다.class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> pascal = new ArrayList<>(rowIndex + 1);
// 초기값 추가
pascal.add(1);
for (int i = 1; i <= rowIndex; i++) {
// 현재 행의 마지막 요소를 추가
pascal.add(1);
// 이전 행의 값들을 기반으로 현재 행의 값을 계산
for (int j = i - 1; j > 0; j--) {
pascal.set(j, pascal.get(j) + pascal.get(j - 1));
}
}
return pascal;
}
}
더 효율적인 Pascal의 삼각형의 특정 행을 계산하는 방법은 현재 행의 값을 저장하고, 이전 값을 활용하여 계산하는 방식입니다. 아래는 메모리 사용을 최소화하고, 오버플로우를 방지하기 위해 List
를 활용하는 대신 배열을 사용하는 개선된 코드입니다.
리스트 초기화:
pascal
리스트를 생성하고, 초기값으로 1을 추가합니다. 이 리스트는 각 행의 값을 저장합니다.행 반복:
for
루프를 통해 행 인덱스에 따라 반복합니다. 각 행의 첫 번째와 마지막 요소는 항상 1이므로, 매 반복에서 1을 추가합니다.현재 행의 값 계산:
for
루프를 사용하여 현재 행의 값을 이전 행의 값들을 기반으로 계산합니다. pascal.set(j, pascal.get(j) + pascal.get(j - 1));
는 현재 인덱스의 값을 이전 두 값을 더하여 업데이트합니다. 이는 메모리를 절약하면서도 필요한 값을 계산하는 방법입니다.