오늘의 학습 키워드
</> 동적계획법
공부한 내용 본인의 언어로 정리하기
import java.util.*;
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
row.add(1);
for(int i = 1; i <= rowIndex; i++){
for(int j = i - 1; j > 0; j--){
row.set(j, row.get(j-1) + row.get(j));
}
row.add(1);
}
return row;
}
}
오늘의 회고
오늘은 어제랑 비슷한 종류의 문제가 나왔다. 차이점은 이중 리스트가 리스트로 변경 됬다는것, 그리고 마지막 행의 값만 구하면 된다는것
그래서 일단 List로 결과를 보여줄 객체를 만들고 시작했다.
List<Integer> row = new ArrayList<>();
그리고 시작과 마지막은 1로 고정되어있으므로 추가해 주었다.
row.add(1);
row.add(1);
중간값을 가져와야하는데 예시를 보면 rowIndex보다 +1번째 행을 구해야 하므로
for(int i = 1; i <= rowIndex; i++)
로 만들어 주었다.
그리고 이중 for문을 이용해 이전 행의 인접한 2개의 값을 더해주는데
for(int j = i - 1; j > 0; j--)
로 만들어 준 이유는
i-1
을 하지 않으면 역순으로 진행하는 순서에서 인덱스 값이 초과해버리기 때문에 오류가 난다.
그래서 역순으로
row.get(j, row.set(j-1) + row.set(j));
로 인접한 두개의 값을 더해서 row의 j번째 값으로 가져다주었다.
이렇게 되면 오류가 나는데 그 이유는 시작이 1이었지만 마지막 row.add(1)
때문에 최상위에도 1이 하나가 더 들어가 에러가 나는것이므로, i for문
안에 마지막 1을 추가하는 식으로 넣어주어야한다.
그래서 완성된 것이
for(int i = 1; i <= rowIndex; i++){
for(int j = i - 1; j > 0; j--){
row.set(j, row.get(j-1) + row.get(j));
}
row.add(1);
}
이렇다.
AI 코드리뷰
현재 코드의 장점
현재 코드의 단점
시간 복잡도
개선 제안
오늘은 AI의 코드 제안 대신 클럽장님이 말한 이항 계수의 방법을 이용한 코드를 작성한다.
import java.util.*;
class Solution {
public List<Integer> getRow(int rowIndex) {
List<Integer> row = new ArrayList<>();
long coef = 1;
for (int i = 0; i <= rowIndex; i++){
row.add((int) coef);
coef = coef * (rowIndex - i) / (i + 1);
}
return row;
}
}
개선된 버전의 장점:
개선된 버전의 단점:
시간 복잡도:
이 구현은 효율적이지만, 코드의 의도를 명확히 하는 주석을 추가하고 입력 유효성 검사를 포함하면 더 개선될 수 있습니다. 또한, 매우 큰 rowIndex에 대해서는 BigInteger를 사용하여 정밀도 문제를 해결할 수 있습니다.
내일 공부할 것 :
조합론 (Combinatorics)
수학적 최적화
알고리즘 설계 패턴
문제