Skip to content

Commit b8435c2

Browse files
committed
2 parents 73c3d3f + 9ca44c9 commit b8435c2

File tree

14 files changed

+419
-6
lines changed

14 files changed

+419
-6
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""
2+
https://www.acmicpc.net/problem/28069
3+
4+
- 0 ~ N-1 번 계단 옆에 목표 김밥집
5+
- 2가지 중 택 1을 K번 반복하여 김밥집(=N) 에 도달하자
6+
7+
(1) nex_i = 계단 +1
8+
(2) nex_i = i + i//2
9+
-> goal)K번 행동으로 0 -> N 까지 도달 여부 확인하기
10+
(1<=n<=1000000)
11+
# 유형 : 그래프 탐색 - DFS/BFS
12+
- 목적지 "K" 까지 도달 여부 확인
13+
14+
# 출력
15+
김밥 도달 = minigimbob
16+
물 = water
17+
18+
# 풀이 renewal : BFS는 시간 초과난다고 하고, 횟수 count 를 어떻게 해야할지 모르겠다
19+
# 보편적 풀이인 DP 로 간다
20+
- 점화식
21+
22+
23+
"""
24+
import sys
25+
from collections import deque
26+
#1. 입력 변수
27+
N , K = map(int, sys.stdin.readline().split())
28+
# DP
29+
INF = 1e9
30+
dp = [INF] * (N+1)
31+
32+
dp[0] = 0
33+
dp[1] = 1 # 1 = 0+1 1가지 밖에 없음
34+
35+
"""
36+
dp[i] : 현재 i 도달하는데 최소 횟수
37+
dp[i+1] = min(dp[i+1] , dp[i]+1) # 유지 , 업데이트
38+
dp[i + i//2] = min(dp[i+i//2] , dp[i]+1)
39+
"""
40+
41+
for i in range(1,N+1):
42+
if i+1 <= N :
43+
dp[i+1] = min(dp[i+1] , dp[i]+1)
44+
if i+i//2 <= N : #순간이동 가능한 경우
45+
dp[i + i//2] = min(dp[i+i//2] , dp[i]+1)
46+
47+
if dp[N] <= K :
48+
print("minigimbob")
49+
else :
50+
print("water")

Hongjoo/백준/두용액.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
"""
2+
https://www.acmicpc.net/problem/2470
3+
4+
# 음 - 염 / 양 - 산성
5+
goal) 2개 혼합 -> 0에 가장 가까운 두 용액 찾기
6+
# 출력
7+
- 2개 오름차순 출력
8+
- 경우가 2개 이상이면 둘중에 1개 아무거나
9+
# flow
10+
1. 오름차순 정렬
11+
2. 2개가 +- 조합인 경우 => 양끝에 투 포인터..?
12+
=> [-99,-2,-1,4,98]
13+
start end
14+
#2-1. 둘 간 합이 기존 min보다 작으면 -> 업데이트
15+
# start와 end의 절대값 크기 차이를 기준으로 포인터가 이동함
16+
if abs(arr[start]) > abs(arr[end]) => start += 1 이동 , end 유지
17+
elif # end -= 1 이동
18+
else : #같으면
19+
break #끝
20+
21+
22+
# until : start = end 가 같은 idx를 가르키면 (start >= end)
23+
24+
25+
26+
2. 2개가 ++ 조합 => + 중 최소값 2개의 합
27+
3. 2개가 -- 조합 => -중 최대값 2개의 합
28+
=> 3개 비교 후 가장 0에 가까운 값 찾기
29+
"""
30+
31+
import sys
32+
N = int(sys.stdin.readline())
33+
liqs = sorted(list(map(int, sys.stdin.readline().split())))
34+
35+
# print(liqs)
36+
# 1. +- 의 조합
37+
start = 0 ; end = len(liqs)-1
38+
closed_z = [start,end,abs(liqs[start] + liqs[end])]
39+
while start < end :
40+
c = liqs[start] + liqs[end]
41+
if closed_z[-1] > abs(c) :
42+
closed_z = [start,end, abs(c)]
43+
if c == 0 :
44+
break
45+
# print(f"##")
46+
# print(f"# {c} : {closed_z} = {liqs[start]} / {liqs[end]}")
47+
48+
if abs(liqs[start]) > abs(liqs[end]) :
49+
start+= 1
50+
# elif abs(liqs[start]) < abs(liqs[end]) :
51+
else :
52+
end -=1
53+
54+
55+
print(liqs[closed_z[0]] , liqs[closed_z[1]])
56+
57+

Hongjoo/백준/세용액.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""
2+
https://www.acmicpc.net/problem/2473
3+
# 두용액 -> 3용액
4+
# 포인트
5+
#flow
6+
x<= y<= z 일떄
7+
(1) (x,y) 의 모든 조합
8+
(2)z 는 y+1 ~ N 번째 중 x+y+z -> 0 인 숫자 구하기
9+
#ME
10+
(1) Start idx = 0 , end _iex =-1
11+
(2) middle : for문으로 start+1 : end 내 값 중 -(start+end)과 가장 가까운 값 ?
12+
(3) start + end + miidle 합과 기존 최소값 비교하기
13+
14+
4
15+
1 2 3 4
16+
17+
4
18+
-1 -2 -3 -4
19+
20+
4
21+
-2 -1 1 2
22+
23+
# 0 가능
24+
6
25+
-10 0 2 3 4 8
26+
=> -10 2 8
27+
28+
"""
29+
30+
31+
import sys
32+
33+
INF = 1e12
34+
N = int(sys.stdin.readline())
35+
arr = sorted(list(map(int, sys.stdin.readline().split())))
36+
#1. 오름차순 정렬 과 포인트 초기화
37+
38+
total_min = INF
39+
answer = []
40+
# print(f"arr {arr}")
41+
# 2. 투 포인터
42+
# x < y<z 일때 - X 는 fix , y,z는 투 포인터
43+
for i in range(N-2):
44+
x = arr[i]
45+
yp = i+1
46+
zp =N-1
47+
while yp < zp :
48+
xyz_sum =x + arr[yp] + arr[zp]
49+
#결과값 업데이트
50+
if abs(xyz_sum) < total_min : # 업데이트
51+
answer = [x,arr[yp],arr[zp]]
52+
total_min = abs(xyz_sum)
53+
# 포인터 이동
54+
if xyz_sum <0 :
55+
yp+=1
56+
elif xyz_sum >0 :
57+
zp-=1
58+
else : # xyz_sum == 0
59+
print(" ".join(map(str,answer)))
60+
sys.exit()
61+
62+
63+
64+
str_answer = " ".join(map(str,answer))
65+
print(str_answer)

_MonthlyChallenges/DASHBOARD.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22

33
### 👉 그래프
44
- **YoonYn9915**: 1개 ❌
5-
- **Mingguriguri**: 2개
5+
- **Mingguriguri**: 3개
66
- **zaqquum**: 4개 ❌
7+
- **learntosurf**: 3개 ❌
78

89

910
### 👉 DP
10-
- **YoonYn9915**: 2개
11+
- **YoonYn9915**: 3개
1112
- **Mingguriguri**: 6개 ✅
12-
- **zaqquum**: 4개 ❌
13+
- **zaqquum**: 5개 ✅
14+
- **learntosurf**: 0개 ❌
1315

1416

_MonthlyChallenges/scoreboard.json

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
],
88
"DP": [
99
10844,
10-
1562
10+
1562,
11+
2240
1112
],
1213
"achieved": {
1314
"그래프": false,
@@ -17,7 +18,8 @@
1718
"Mingguriguri": {
1819
"그래프": [
1920
1759,
20-
6603
21+
6603,
22+
5107
2123
],
2224
"DP": [
2325
10844,
@@ -43,8 +45,21 @@
4345
10844,
4446
2159,
4547
17484,
46-
17271
48+
17271,
49+
28069
50+
],
51+
"achieved": {
52+
"그래프": false,
53+
"DP": true
54+
}
55+
},
56+
"learntosurf": {
57+
"그래프": [
58+
1759,
59+
6603,
60+
15649
4761
],
62+
"DP": [],
4863
"achieved": {
4964
"그래프": false,
5065
"DP": false
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N = int(input()) # 전체 용액의 수
5+
liquid = sorted(map(int, input().split()))
6+
7+
left = 0
8+
right = N - 1
9+
10+
# 초기값 설정
11+
answer = abs(liquid[left] + liquid[right])
12+
answer_liquid = [liquid[left], liquid[right]]
13+
14+
while left < right:
15+
temp = liquid[left] + liquid[right]
16+
# 합이 0에 더 가까우면 정답 갱신
17+
if abs(temp) < answer:
18+
answer = abs(temp)
19+
answer_liquid = [liquid[left], liquid[right]]
20+
# 포인터 이동
21+
if temp < 0:
22+
left += 1
23+
else:
24+
right -= 1
25+
26+
print(answer_liquid[0], answer_liquid[1])
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
"""
2+
BOJ #1654. 랜선자르기 (실버2)
3+
https://www.acmicpc.net/problem/1654
4+
유형: Binary Search , Parameter Search
5+
"""
6+
K, N = map(int, input().split())
7+
8+
lines = [int(input()) for _ in range(K)]
9+
# 1. 범위 초기화
10+
start = 1
11+
end = max(lines)
12+
#2. 이분 탐색
13+
while start <= end:
14+
mid = (start + end) // 2
15+
cnt = 0
16+
for line in lines:
17+
cnt += line // mid
18+
19+
if cnt < N:
20+
end = mid - 1
21+
else:
22+
start = mid + 1
23+
24+
print(end)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## 🚀4월 4주차 (4/28) 스터디 발제 주제: Binary Search , Parameter Search
2+
> 발제자: 김홍주 (zaqquum)
3+
4+
> [!NOTE]
5+
> 주제: Binary Search , Parameter Searcg
6+
7+
### 🗂️ 스터디 자료
8+
- PDF: [바로가기
9+
](Study_BOJ_2110.pdf)
10+
11+
### 📖 문제
12+
- [백준 #2110. 공유기설치](https://www.acmicpc.net/problem/2110): Binary Search , Parameter Search / 골드 4
13+
- 정답 코드: [Study_BOJ_2110_공유기설치.py](Study_BOJ_2110_공유기설치.py)
14+
15+
### 💻 과제
16+
- [백준 #1654. 랜선 자르기](https://www.acmicpc.net/problem/1654): Binary Search , Parameter Search / 실버 2
17+
- 정답 코드: [Assignment_BOJ_1654_랜선 자르기.py](Assignment_BOJ_1654_랜선자르기.py)
389 KB
Binary file not shown.
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
"""
2+
BOJ #2110. 공유기설치 (골드4)
3+
https://www.acmicpc.net/problem/2110
4+
유형: Binary Search , Parameter Search
5+
"""
6+
import sys
7+
input = sys.stdin.readline
8+
9+
#1. 입력 변수 + 오름차순 정렬
10+
N , C = map(int, input().split())
11+
arr =sorted([int(input()) for _ in range(N)])
12+
13+
#2. “최소 거리 dist”의 탐색 범위 초기화 # 이진 탐색
14+
start = 1 ; end = arr[-1] - arr[0]
15+
answer = 0 # 최소 거리 중 최대 거리
16+
17+
#3.최소 인접 거리 dist 최대값 찾기
18+
#설치 공유기는 dist이상의 간격으로 설치
19+
while start <= end :
20+
mid = (start+end)//2
21+
cnt = 1 # arr[0]은 설치 시작점
22+
23+
#[1] 최소 인접 거리가 mid 이상으로 "최대 설치 가능 공유기 개수계산"
24+
prev = arr[0] # 이전에 설치한 공유기 위치
25+
for i in range(1,N) :
26+
if arr[i] - prev >= mid : # 공유기 등록
27+
prev = arr[i]
28+
cnt+=1
29+
# 공유기 등록하기엔 dist부족한 경우 -> 다음 arr로 이동
30+
31+
#[2] 최소거리 dist 이분 탐색
32+
# True 경우 , 최소거리 Answer 업데이트, 탐색 범위 (mid+1 : end) 이동
33+
if cnt >= C :
34+
answer = max(answer ,mid)
35+
start = mid+1
36+
# False 경우: 탐색 범위 Lower bound로 이동(start : mid)
37+
else :
38+
end = mid - 1
39+
40+
print(answer)

0 commit comments

Comments
 (0)