Skip to content

posting: 동적계획법 풀이 - #77

Merged
youngduck merged 3 commits into
mainfrom
posting/260609
Jun 9, 2026
Merged

posting: 동적계획법 풀이#77
youngduck merged 3 commits into
mainfrom
posting/260609

Conversation

@youngduck

Copy link
Copy Markdown
Owner

PR전 코드 퀄리티 체크하기

작업내용

작업내용을 간단/상세하게 작성해주세요.


🔍 가독성 (Readability) CHECK

명명 규칙

  • 매직넘버를 명명된 상수로 교체했나요?
    • const ANIMATION_DELAY_MS = 300 형태로 의미 있는 이름 사용
  • 복잡한 조건문을 명명된 변수로 분리했나요?
    • const isValidUser = user.age >= 18 && user.isVerified
  • 변수명이 그 자체로 의미를 전달하나요?
    • userDataauthenticatedUser, listactiveUserList

구조 및 구성

  • import문이 절대경로로 정리/정렬되어 있나요?
  • 변수 선언이 컴포넌트 상단에서 이루어지고 하단에서 사용되나요?
  • 위에서 아래로 읽기 쉬운 흐름으로 구성되어 있나요?

추상화 및 분리

  • 복잡한 로직을 전용 컴포넌트/훅으로 추상화했나요?
    • 인증 체크 → AuthGuard 컴포넌트
    • 복잡한 상호작용 → 전용 버튼 컴포넌트
  • 조건부 렌더링이 복잡한 경우 별도 컴포넌트로 분리했나요?
    • ViewerSubmitButton, AdminSubmitButton로 역할별 분리
  • 복잡한 삼항 연산자를 if/else 또는 IIFE로 교체했나요?

🎯 예측 가능성 (Predictability) CHECK

반환 타입 일관성

  • 유사한 기능의 함수/훅이 일관된 반환 타입을 사용하나요?
    • API 훅: UseQueryResult<T, Error> 일관 사용
    • 검증 함수: { ok: boolean; reason?: string } 형태 일관 사용

단일 책임 원칙

  • 함수가 이름에서 암시하는 동작만 수행하나요?
    • fetchBalance()가 로깅 등 부수효과 없이 balance만 반환
  • 숨겨진 사이드 이펙트가 없나요?

명확한 명명

  • 커스텀 래퍼/함수가 고유하고 설명적인 이름을 사용하나요?
    • http.get()httpService.getWithAuth()
    • useModal()useConfirmationModal()

🔗 응집도 (Cohesion) CHECK

도메인별 구성

  • 관련된 코드가 함께 배치되어 있나요?
    • 기능별 디렉토리 구조: domains/user/, domains/product/
  • 매직넘버가 관련 로직 근처에 정의되어 있나요?

폼 응집도

  • 폼 검증 로직이 적절한 수준에서 응집되어 있나요?
    • 필드별 독립 검증 vs 폼 수준 스키마 검증
  • 관련 상태와 로직이 함께 관리되고 있나요?

⚡ 결합도 (Coupling) CHECK

상태 관리 범위

  • 상태 관리가 적절한 범위로 분리되어 있나요?
    • 전역 상태 vs 로컬 상태의 적절한 분리
  • 컴포넌트가 불필요한 상태에 의존하지 않나요?
    • useCardIdQueryParam() 같은 focused hook 사용

Props Drilling 제거

  • Props Drilling이 발생하는 경우 컴포지션 패턴을 사용했나요?
  • 중간 컴포넌트가 불필요한 props 전달을 하고 있지 않나요?

추상화 수준

  • 성급한 추상화를 피하고 적절한 중복을 허용했나요?
    • 서로 다른 유스케이스가 예상되는 경우 별도 구현 고려
  • 추상화가 과도하게 복잡하지 않나요?

📋 추가 CHECK

성능 고려사항

  • 불필요한 리렌더링을 방지했나요?
    • useCallback, useMemo 적절 사용
  • 무거운 연산을 적절히 최적화했나요?

타입 안정성

  • TypeScript 타입이 명확하고 안전하게 정의되어 있나요?
  • any 타입 사용을 최소화했나요?

테스트 가능성

  • 작성된 코드가 테스트하기 쉬운 구조인가요?
  • 순수 함수와 사이드 이펙트가 분리되어 있나요?

문서화

  • 복잡한 로직에 대한 주석이 적절히 작성되어 있나요?
  • 인터페이스나 타입에 대한 설명이 필요한 경우 추가되어 있나요?

🎨 코드 스타일 CHECK

  • 일관된 코딩 스타일을 유지하나요?
  • ESLint/Prettier 규칙을 준수하나요?
  • 불필요한 콘솔 로그나 주석이 제거되었나요?

@youngduck
youngduck merged commit 994da59 into main Jun 9, 2026
2 of 3 checks passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adds JavaScript solutions for LeetCode problems (Number of Islands and Unique Paths) and a comprehensive study note on SQLD Chapter 1. The reviewer provided valuable feedback, including adding safety checks for empty inputs in the island-counting algorithm, addressing potential integer overflow and stack overflow issues in the unique paths factorial calculation, and correcting several typographical errors in the SQLD study notes.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +70 to +72
let result = 0;
const end_row = grid.length;
const end_col = grid[0].length;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

입력 grid가 빈 배열이거나 null/undefined인 경우, grid[0]에 접근할 때 TypeError가 발생할 수 있습니다. 실제 서비스 환경이나 견고한 코드를 위해 예외 처리를 추가하는 것이 좋습니다.

Suggested change
let result = 0;
const end_row = grid.length;
const end_col = grid[0].length;
if (!grid || grid.length === 0 || grid[0].length === 0) {
return 0;
}
let result = 0;
const end_row = grid.length;
const end_col = grid[0].length;

Comment on lines +70 to +77
const factorial = (num) => {
if (num <= 1) {
return 1;
}
return num * factorial(num - 1);
};

return factorial(m + n - 2) / (factorial(n - 1) * factorial(m - 1));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

제약 조건에 따르면 $m, n \le 100$이므로 $m + n - 2$는 최대 198이 될 수 있습니다. JavaScript에서 171! 이상은 Infinity로 표현되기 때문에, factorial(198) 호출 시 Infinity가 반환되어 최종 결과가 NaN이 됩니다. 또한 재귀 호출로 인해 스택 오버플로우 위험이 있습니다.\n\n조합(Combination)을 계산할 때 곱셈과 나눗셈을 번갈아 수행하는 반복문 방식을 사용하면 오버플로우를 방지하고 시간/공간 복잡도를 $O(\min(m, n))$$O(1)$로 최적화할 수 있습니다.

Suggested change
const factorial = (num) => {
if (num <= 1) {
return 1;
}
return num * factorial(num - 1);
};
return factorial(m + n - 2) / (factorial(n - 1) * factorial(m - 1));
let ans = 1;
const k = Math.min(m - 1, n - 1);
for (let i = 1; i <= k; i++) {
ans = (ans * (m + n - 2 - k + i)) / i;
}
return Math.round(ans);

- 관점에 따라 다르게 해석되지 않고 모호함이 없어야함
- 모델링시 유의사항
- 중복최소화 : DB 여러곳에 같은 정보를 중복하여 저장하지 않아야함
- 비유연성 최소화 : 데이터의 정의와 테이터의 사용 프로세스를 분리하여 데이터, 프로세스의 변화가 프로그램과 DB에 미치는 영향 최소화 해야함

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

'테이터의'는 오타입니다. '데이터의'로 수정하는 것이 좋습니다.

Suggested change
- 비유연성 최소화 : 데이터의 정의와 테이터의 사용 프로세스를 분리하여 데이터, 프로세스의 변화가 프로그램과 DB에 미치는 영향 최소화 해야함
- 비유연성 최소화 : 데이터의 정의와 데이터의 사용 프로세스를 분리하여 데이터, 프로세스의 변화가 프로그램과 DB에 미치는 영향 최소화 해야함


### 속성 개념

- 엔터티에 대한 자세하고 구체적인 정보, 엔티의 하위요소

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

'엔티의'는 오타입니다. '엔터티의'로 수정하는 것이 좋습니다.

Suggested change
- 엔터티에 대한 자세하고 구체적인 정보, 엔티의 하위요소
- 엔터티에 대한 자세하고 구체적인 정보, 엔터티의 하위요소

### 속성 값

- 속성이 가질 수 있는 특정 값
- 속성값이 으미적으로 다중 값을 포함할때, 1차 정규화 진행

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

'으미적으로'는 오타입니다. '의미적으로'로 수정하는 것이 좋습니다.

Suggested change
- 속성값이 으미적으로 다중 값을 포함할때, 1차 정규화 진행
- 속성값이 의미적으로 다중 값을 포함할때, 1차 정규화 진행


- 유일성 : 각 엔터티 인스턴스를 유일하게 구별
- 최소성 : 최소성을 보장하면서 최소 개수의 속성
- 붋변성 : 속성값이 최초 생성시 부여된 값에서 변하면안됨

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

'붋변성'은 오타입니다. '불변성'으로 수정하는 것이 좋습니다.

Suggested change
- 붋변성 : 속성값이 최초 생성시 부여된 값에서 변하면안됨
- 불변성 : 속성값이 최초 생성시 부여된 값에서 변하면안됨

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant