Skip to content

Commit 91a0bcf

Browse files
authored
Merge pull request #203 from AlgorithmStudy-Allumbus/hongjoo
HONGJOO / 4월 4주차 /3개
2 parents 0e8dbba + 9a558c6 commit 91a0bcf

File tree

3 files changed

+172
-0
lines changed

3 files changed

+172
-0
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)

0 commit comments

Comments
 (0)