Skip to content

Conversation

@uyeon0
Copy link
Collaborator

@uyeon0 uyeon0 commented Oct 4, 2025

User description

오늘도 멋져요 👍✨


PR Type

Enhancement


Description

  • 이중 연결 리스트를 사용한 표 편집 문제 해결

  • 스택 기반의 괄호 검증 로직 개선

  • 연속된 숫자 제거와 컨트롤 제트 기능 구현


@uyeon0 uyeon0 added the programmers Programmers 문제 풀이 label Oct 4, 2025
@github-actions
Copy link

github-actions bot commented Oct 4, 2025

PR Reviewer Guide 🔍

🧪 PR contains tests
⚡ Recommended focus areas for review

성능 개선 가능

findNextExistingRow 함수에서 선형 탐색(O(n))을 수행하고 있습니다. 이중 연결 리스트를 사용하더라도 삭제된 노드들의 인덱스를 Set으로 관리하면 O(1)로 개선할 수 있습니다.

function findNextExistingRow(rows, start, direction, n) {
  let idx = start;
  while (idx >= 0 && idx < n && rows[idx] === false) {
    idx += direction;
  }
  return idx;
}
메모리 최적화

배열의 마지막 요소 접근을 위해 answer.length를 매번 계산하는 대신, 포인터 변수를 사용하여 메모리와 연산을 줄일 수 있습니다. 또한 Set을 활용하면 중복 제거를 더 효율적으로 할 수 있습니다.

for (const num of arr) {
  if (answer.length > 0 && answer[answer.length - 1] === num) {
    // 연속으로 등장한 경우 그냥 넘어간다
    continue;
  }
  answer.push(num);
}
엣지 케이스 처리

숫자가 문자열로 들어올 때 음수나 소수점이 포함된 경우, Number() 변환 시 예상치 못한 결과가 발생할 수 있습니다. parseInt나 parseFloat 사용을 고려해보세요.

// s는 숫자, "Z", 공백으로 이루어져 있습니다.
answer += Number(arr[idx]);

@github-actions
Copy link

github-actions bot commented Oct 4, 2025

PR Code Suggestions ✨

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
General
노드 연결 로직 모듈화

노드 연결 관리 로직이 "C"와 "Z" 케이스에서 유사하게 반복됩니다. 이를 재사용 가능한 함수로 분리하여 코드의 유지보수성을 개선할 수 있습니다.

Programmers/Level3/81303_표_편집.js [44-52]

-const prevNode = prev[cursor];
-const nextNode = next[cursor];
+const updateNodeConnections = (node, isDelete = true) => {
+  const prevNode = prev[node];
+  const nextNode = next[node];
+  
+  if (prevNode !== -1) next[prevNode] = isDelete ? nextNode : node;
+  if (nextNode !== -1) prev[nextNode] = isDelete ? prevNode : node;
+  
+  return { prevNode, nextNode };
+};
 
-// 연결 끊기
-if (prevNode !== -1) next[prevNode] = nextNode;
-if (nextNode !== -1) prev[nextNode] = prevNode;
-
-// 다음 커서 업데이트
+// 사용 예시
+const { prevNode, nextNode } = updateNodeConnections(cursor);
 cursor = nextNode !== n ? nextNode : prevNode;
Suggestion importance[1-10]: 6

__

Why: 노드 연결 로직을 재사용 가능한 함수로 분리하는 것은 코드의 유지보수성과 가독성을 개선하는 좋은 제안임. 특히 CZ 연산에서 유사한 로직이 반복되는 것을 효과적으로 해결함.

Low
중복 로직을 함수로 추출

커서 이동 로직이 "U"와 "D" 케이스에서 중복됩니다. 이를 별도의 함수로 추출하여 코드 중복을 제거하고 가독성을 향상시킬 수 있습니다.

Programmers/Level3/81303_표_편집.js [24-39]

+const moveCursor = (steps, direction) => {
+  let current = cursor;
+  for (let i = 0; i < steps; i++) {
+    current = direction === 'up' ? prev[current] : next[current];
+  }
+  return current;
+};
+
 for (const c of cmd) {
   const op = c[0];
 
   switch (op) {
     case "U":
-      const upSteps = parseInt(c.split(" ")[1]);
-      for (let cnt = 0; cnt < upSteps; cnt++) {
-        cursor = prev[cursor];
-      }
+      cursor = moveCursor(parseInt(c.split(" ")[1]), 'up');
       break;
     case "D":
-      const downSteps = parseInt(c.split(" ")[1]);
-      for (let cnt = 0; cnt < downSteps; cnt++) {
-        cursor = next[cursor];
-      }
+      cursor = moveCursor(parseInt(c.split(" ")[1]), 'down');
       break;
Suggestion importance[1-10]: 5

__

Why: 커서 이동 로직을 함수로 추출하는 것은 코드 중복을 줄이고 가독성을 향상시키는 유효한 리팩토링이지만, 현재 구현도 충분히 명확하고 이해하기 쉬움. 성능이나 기능성에 영향을 주지 않는 스타일 개선임.

Low
함수형 접근으로 로직 단순화

전통적인 for 루프 대신 더 현대적이고 가독성 높은 reduce 메서드를 사용하여 로직을 단순화할 수 있습니다. 이는 코드의 의도를 더 명확하게
표현합니다.

Programmers/Level0/120853_컨트롤_제트.js [12-23]

-for (let idx = 0; idx < arr.length; idx++) {
-  if (arr[idx] === "Z") {
-    // 직전 숫자를 빼 준다.
-    // s는 "Z"로 시작하지 않습니다.
-    // "Z"가 연속해서 나오는 경우는 없습니다.
-    answer -= arr[idx - 1];
-  } else {
-    // 숫자로 변환해서 더해준다.
-    // s는 숫자, "Z", 공백으로 이루어져 있습니다.
-    answer += Number(arr[idx]);
+const answer = arr.reduce((sum, current, idx) => {
+  if (current === "Z") {
+    return sum - Number(arr[idx - 1]);
   }
-}
+  return sum + Number(current);
+}, 0);
Suggestion importance[1-10]: 4

__

Why: reduce 메서드를 사용한 리팩토링은 코드를 더 간결하게 만들지만, 현재의 명시적인 for 루프도 충분히 명확하고 이해하기 쉬움. 순전히 스타일 선호도의 문제임.

Low

@yoouyeon yoouyeon added ready-to-merge pr을 머지해주세요 programmers Programmers 문제 풀이 and removed programmers Programmers 문제 풀이 labels Oct 6, 2025
@uyeon0 uyeon0 merged commit d5a208c into main Oct 6, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

programmers Programmers 문제 풀이 ready-to-merge pr을 머지해주세요

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants