Skip to content

Commit 1b64f0f

Browse files
authored
Merge branch 'DaleStudy:main' into main
2 parents 738f821 + b1ba303 commit 1b64f0f

File tree

243 files changed

+7238
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

243 files changed

+7238
-178
lines changed

.github/workflows/integration.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ jobs:
1717
run: |
1818
echo "🔍 PR 번호: ${{ github.event.pull_request.number }}"
1919
pr_number="${{ github.event.pull_request.number }}"
20-
20+
2121
echo "📋 PR 라벨 조회 중..."
2222
labels_json=$(gh pr view $pr_number --json labels -q '.labels[].name')
2323
echo "확인된 라벨: $labels_json"
24-
24+
2525
if [ -n "$labels_json" ]; then
2626
has_maintenance=$(echo $labels_json | grep -q 'maintenance' && echo 'true' || echo 'false')
2727
echo "maintenance 라벨 포함 여부: $has_maintenance"

.github/workflows/management.yaml

Lines changed: 88 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ on:
1111
options:
1212
- approve-prs
1313
- merge-prs
14+
week:
15+
description: 'Week number to filter (optional, e.g., "1")'
16+
required: false
17+
type: string
18+
default: ""
1419
exclude_prs:
1520
description: 'PR numbers to exclude (comma-separated, e.g., "1972,1973")'
1621
required: false
@@ -40,11 +45,20 @@ jobs:
4045
excludes="[$(echo "$exclude_input" | sed 's/,/, /g')]"
4146
fi
4247
48+
# Build request payload
49+
week_input="${{ inputs.week }}"
50+
if [ -z "$week_input" ]; then
51+
payload="{\"repo_name\": \"${{ github.event.repository.name }}\", \"excludes\": $excludes}"
52+
else
53+
payload="{\"repo_name\": \"${{ github.event.repository.name }}\", \"week\": \"Week $week_input\", \"excludes\": $excludes}"
54+
fi
55+
56+
echo "주차 필터: ${week_input:-전체}"
4357
echo "제외할 PR: $excludes"
4458
4559
response=$(curl -s -X POST "https://github.dalestudy.com/approve-prs" \
4660
-H "Content-Type: application/json" \
47-
-d "{\"repo_name\": \"${{ github.event.repository.name }}\", \"excludes\": $excludes}")
61+
-d "$payload")
4862
4963
echo "response=$response" >> $GITHUB_OUTPUT
5064
echo "$response" | jq '.'
@@ -55,6 +69,10 @@ jobs:
5569
5670
success=$(echo "$response" | jq -r '.success // false')
5771
total=$(echo "$response" | jq -r '.total_open_prs // 0')
72+
week_filter=$(echo "$response" | jq -r '.week_filter // null')
73+
week_matched=$(echo "$response" | jq -r '.week_matched // 0')
74+
week_mismatched=$(echo "$response" | jq -r '.week_mismatched // 0')
75+
solving_excluded=$(echo "$response" | jq -r '.solving_excluded // 0')
5876
processed=$(echo "$response" | jq -r '.processed // 0')
5977
approved=$(echo "$response" | jq -r '.approved // 0')
6078
skipped=$(echo "$response" | jq -r '.skipped // 0')
@@ -69,18 +87,42 @@ jobs:
6987
fi
7088
7189
echo "" >> $GITHUB_STEP_SUMMARY
90+
if [ "$week_filter" != "null" ]; then
91+
echo "- 🗓️ 주차 필터: **$week_filter**" >> $GITHUB_STEP_SUMMARY
92+
fi
7293
echo "- 📋 전체 Open PR: **$total**개" >> $GITHUB_STEP_SUMMARY
94+
if [ "$week_filter" != "null" ]; then
95+
echo "- ✅ $week_filter 매칭: **$week_matched**개" >> $GITHUB_STEP_SUMMARY
96+
echo "- ❌ Week 불일치: **$week_mismatched**개" >> $GITHUB_STEP_SUMMARY
97+
echo "- 🔄 Solving 상태 제외: **$solving_excluded**개" >> $GITHUB_STEP_SUMMARY
98+
fi
7399
echo "- 🔍 검사한 PR: **$processed**개" >> $GITHUB_STEP_SUMMARY
74100
echo "- ✅ 승인한 PR: **$approved**개" >> $GITHUB_STEP_SUMMARY
75101
echo "- ⏭️ 건너뛴 PR: **$skipped**개" >> $GITHUB_STEP_SUMMARY
76102
77103
# Show detailed results if available
78-
results=$(echo "$response" | jq -r '.results // []')
79-
if [ "$results" != "[]" ]; then
104+
result_count=$(echo "$response" | jq -r '.results | length')
105+
if [ "$result_count" -gt 0 ]; then
80106
echo "" >> $GITHUB_STEP_SUMMARY
81107
echo "### 📝 상세 결과" >> $GITHUB_STEP_SUMMARY
82108
echo "" >> $GITHUB_STEP_SUMMARY
83-
echo "$response" | jq -r '.results[] | "- PR #\(.pr_number): \(.status) \(if .reason then "(\(.reason))" else "" end)"' >> $GITHUB_STEP_SUMMARY
109+
110+
echo "$response" | jq -c '.results[]' | while read -r item; do
111+
pr=$(echo "$item" | jq -r '.pr')
112+
title=$(echo "$item" | jq -r '.title')
113+
skipped=$(echo "$item" | jq -r '.skipped // false')
114+
approved=$(echo "$item" | jq -r '.approved // false')
115+
reason=$(echo "$item" | jq -r '.reason // ""')
116+
error=$(echo "$item" | jq -r '.error // ""')
117+
118+
if [ "$skipped" = "true" ]; then
119+
echo "- PR #$pr [$title]: ⏭️ skipped ($reason)" >> $GITHUB_STEP_SUMMARY
120+
elif [ "$approved" = "true" ]; then
121+
echo "- PR #$pr [$title]: ✅ approved" >> $GITHUB_STEP_SUMMARY
122+
else
123+
echo "- PR #$pr [$title]: ❌ failed (${error:-unknown})" >> $GITHUB_STEP_SUMMARY
124+
fi
125+
done
84126
fi
85127
86128
merge-prs:
@@ -105,13 +147,23 @@ jobs:
105147
excludes="[$(echo "$exclude_input" | sed 's/,/, /g')]"
106148
fi
107149
150+
# Build request payload
151+
week_input="${{ inputs.week }}"
108152
merge_method="merge"
153+
154+
if [ -z "$week_input" ]; then
155+
payload="{\"repo_name\": \"${{ github.event.repository.name }}\", \"merge_method\": \"$merge_method\", \"excludes\": $excludes}"
156+
else
157+
payload="{\"repo_name\": \"${{ github.event.repository.name }}\", \"merge_method\": \"$merge_method\", \"week\": \"Week $week_input\", \"excludes\": $excludes}"
158+
fi
159+
109160
echo "머지 방식: $merge_method"
161+
echo "주차 필터: ${week_input:-전체}"
110162
echo "제외할 PR: $excludes"
111163
112164
response=$(curl -s -X POST "https://github.dalestudy.com/merge-prs" \
113165
-H "Content-Type: application/json" \
114-
-d "{\"repo_name\": \"${{ github.event.repository.name }}\", \"merge_method\": \"$merge_method\", \"excludes\": $excludes}")
166+
-d "$payload")
115167
116168
echo "response=$response" >> $GITHUB_OUTPUT
117169
echo "$response" | jq '.'
@@ -122,6 +174,10 @@ jobs:
122174
123175
success=$(echo "$response" | jq -r '.success // false')
124176
total=$(echo "$response" | jq -r '.total_open_prs // 0')
177+
week_filter=$(echo "$response" | jq -r '.week_filter // null')
178+
week_matched=$(echo "$response" | jq -r '.week_matched // 0')
179+
week_mismatched=$(echo "$response" | jq -r '.week_mismatched // 0')
180+
solving_excluded=$(echo "$response" | jq -r '.solving_excluded // 0')
125181
processed=$(echo "$response" | jq -r '.processed // 0')
126182
merged=$(echo "$response" | jq -r '.merged // 0')
127183
skipped=$(echo "$response" | jq -r '.skipped // 0')
@@ -138,16 +194,40 @@ jobs:
138194
139195
echo "" >> $GITHUB_STEP_SUMMARY
140196
echo "- 🔧 머지 방식: **$merge_method**" >> $GITHUB_STEP_SUMMARY
197+
if [ "$week_filter" != "null" ]; then
198+
echo "- 🗓️ 주차 필터: **$week_filter**" >> $GITHUB_STEP_SUMMARY
199+
fi
141200
echo "- 📋 전체 Open PR: **$total**개" >> $GITHUB_STEP_SUMMARY
201+
if [ "$week_filter" != "null" ]; then
202+
echo "- ✅ $week_filter 매칭: **$week_matched**개" >> $GITHUB_STEP_SUMMARY
203+
echo "- ❌ Week 불일치: **$week_mismatched**개" >> $GITHUB_STEP_SUMMARY
204+
echo "- 🔄 Solving 상태 제외: **$solving_excluded**개" >> $GITHUB_STEP_SUMMARY
205+
fi
142206
echo "- 🔍 검사한 PR: **$processed**개" >> $GITHUB_STEP_SUMMARY
143207
echo "- ✅ 머지한 PR: **$merged**개" >> $GITHUB_STEP_SUMMARY
144208
echo "- ⏭️ 건너뛴 PR: **$skipped**개" >> $GITHUB_STEP_SUMMARY
145209
146210
# Show detailed results if available
147-
results=$(echo "$response" | jq -r '.results // []')
148-
if [ "$results" != "[]" ]; then
211+
result_count=$(echo "$response" | jq -r '.results | length')
212+
if [ "$result_count" -gt 0 ]; then
149213
echo "" >> $GITHUB_STEP_SUMMARY
150214
echo "### 📝 상세 결과" >> $GITHUB_STEP_SUMMARY
151215
echo "" >> $GITHUB_STEP_SUMMARY
152-
echo "$response" | jq -r '.results[] | "- PR #\(.pr_number): \(.status) \(if .reason then "(\(.reason))" else "" end)"' >> $GITHUB_STEP_SUMMARY
216+
217+
echo "$response" | jq -c '.results[]' | while read -r item; do
218+
pr=$(echo "$item" | jq -r '.pr')
219+
title=$(echo "$item" | jq -r '.title')
220+
skipped=$(echo "$item" | jq -r '.skipped // false')
221+
merged=$(echo "$item" | jq -r '.merged // false')
222+
reason=$(echo "$item" | jq -r '.reason // ""')
223+
error=$(echo "$item" | jq -r '.error // ""')
224+
225+
if [ "$skipped" = "true" ]; then
226+
echo "- PR #$pr [$title]: ⏭️ skipped ($reason)" >> $GITHUB_STEP_SUMMARY
227+
elif [ "$merged" = "true" ]; then
228+
echo "- PR #$pr [$title]: ✅ merged" >> $GITHUB_STEP_SUMMARY
229+
else
230+
echo "- PR #$pr [$title]: ❌ failed (${error:-unknown})" >> $GITHUB_STEP_SUMMARY
231+
fi
232+
done
153233
fi

3sum/WHYjun.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
class Solution:
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
answer = []
4+
sortedNums = sorted(nums)
5+
6+
for i in range(len(sortedNums)):
7+
# skip if same to avoid dup
8+
if i > 0 and sortedNums[i] == sortedNums[i-1]:
9+
continue
10+
11+
# use two pointers
12+
j = i + 1
13+
k = len(sortedNums) - 1
14+
15+
while j < k:
16+
total = sortedNums[i] + sortedNums[j] + sortedNums[k]
17+
18+
if total == 0:
19+
answer.append([sortedNums[i], sortedNums[j], sortedNums[k]])
20+
j += 1
21+
# skip if same to avoid dup
22+
while sortedNums[j] == sortedNums[j-1] and j < k:
23+
j += 1
24+
elif total < 0:
25+
j += 1
26+
else:
27+
k -= 1
28+
29+
return answer

3sum/daiyongg-kim.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
class Solution:
2+
def threeSum(self, nums: List[int]) -> List[List[int]]:
3+
nums.sort()
4+
5+
result = []
6+
n = len(nums)
7+
8+
for i in range(n - 2):
9+
10+
if i > 0 and nums[i] == nums[i - 1]:
11+
continue
12+
13+
left = i + 1
14+
right = n - 1
15+
while left < right:
16+
current_sum = nums[i] + nums[left] + nums[right]
17+
18+
if current_sum == 0:
19+
result.append([nums[i], nums[left], nums[right]])
20+
21+
while left < right and nums[left] == nums[left + 1]:
22+
left += 1
23+
24+
while left < right and nums[right] == nums[right - 1]:
25+
right -= 1
26+
27+
left += 1
28+
right -= 1
29+
30+
elif current_sum < 0:
31+
left += 1
32+
33+
else:
34+
right -= 1
35+
36+
return result

3sum/haxr369.java

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.HashSet;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
/**
8+
* 세 수의 인덱스가 모두 다르고 세 수 합이 0인 경우의 수를 구하기
9+
* 세 숫자가 들어간 배열은 중복되게 하지 않은다.
10+
*
11+
* 1. 모든 경우의 수를 구한다. => O(N^3)
12+
* 3000*3000*3000 == 9*10^9 => 9억건...
13+
* 2. left, mid, right라고 할 때, mid를 고정하고 left, right만 움직이는 two pointer를 응용하기
14+
*/
15+
class Solution {
16+
/**
17+
* Runtime: 545 ms (Beats 14.44%)
18+
* Memory: 60.78 MB (Beats 5.38%)
19+
* Space Complexity: O(N)
20+
* - 정렬을 위한 공간 => O(N)
21+
* - 세 수를 저장하기 위한 리스트 => O(3)
22+
* > O(N) + O(3) => O(N)
23+
* Time Complexity: O(NlogN)
24+
* - 정렬을 위한 시간 => O(NlogN)
25+
* - mid의 순회 => O(N)
26+
* - two pointer 조회 => O(N)
27+
* > O(NlogN) + O(N)*O(N) ~= O(N^2)
28+
*/
29+
public List<List<Integer>> threeSum(int[] nums) {
30+
int L = nums.length;
31+
Arrays.sort(nums);
32+
33+
Set<List<Integer>> st = new HashSet<>();
34+
35+
// mid를 늘려가면서 투 포인터 진행
36+
for (int mid = 1; mid < L - 1; mid++) {
37+
int left = 0;
38+
int right = L - 1;
39+
while (left < mid && mid < right) {
40+
int sm = nums[left] + nums[mid] + nums[right];
41+
if (sm == 0) {
42+
/**
43+
* left를 더하는 이유:
44+
* 현재 찾은 경우의 수 외에 다른 경우가 존재할 수 있음
45+
* ex) -7,1,6 / -6,1,5
46+
* => mid는 고정이지만, left는 늘리고 right를 줄여서 0을 만들 수 있는 다른 경우가 있음
47+
*/
48+
List<Integer> li = new ArrayList<>();
49+
li.add(nums[left]);
50+
li.add(nums[mid]);
51+
li.add(nums[right]);
52+
st.add(li); // 중복값이 있어도 무시할 수 있음.
53+
left++;
54+
} else if (sm < 0) { // 부족하면 left 늘리기
55+
left++;
56+
} else { // 과하면 right 줄이기
57+
right--;
58+
}
59+
}
60+
}
61+
62+
return new ArrayList<>(st);
63+
}
64+
}

3sum/ppxyn1.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# idea: sorting + two pointer
2+
# The idea was straightforward, but remove the duplication logic was the tricky.
3+
4+
class Solution:
5+
def threeSum(self, nums: List[int]) -> List[List[int]]:
6+
nums.sort()
7+
n = len(nums)
8+
answer = []
9+
10+
for i in range(n):
11+
if i > 0 and nums[i] == nums[i-1]:
12+
continue
13+
14+
left, right = i+1, n-1
15+
16+
while left < right:
17+
s = nums[i] + nums[left] + nums[right]
18+
if s == 0:
19+
answer.append([nums[i], nums[left], nums[right]])
20+
while left < right and nums[left] == nums[left+1]:
21+
left += 1
22+
while left < right and nums[right] == nums[right-1]:
23+
right -= 1
24+
left += 1
25+
right -= 1
26+
elif s < 0:
27+
left += 1
28+
else:
29+
right -= 1
30+
return answer
31+
32+

0 commit comments

Comments
 (0)