Skip to content

Commit a164660

Browse files
committed
2 parents 476bc2a + a4eef29 commit a164660

File tree

5 files changed

+157
-0
lines changed

5 files changed

+157
-0
lines changed

Hongjoo/백준/계단 오르기.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
'''
2+
1. 계단은 step +1 or step+2
3+
2. 연속된 세계 계단을 모두 밟으면 안됨 (1,2,3,x), 시작점은 계단 ㄴㄴ
4+
3.마지막 도착계단은 반드시 밟기
5+
6+
# flag
7+
이전 +1 :(new = 현 step +1 ) -> 안됨
8+
이전 +2or 1 : (new=현 step+2) -> 가능
9+
10+
dp[] : max 값만 넣기
11+
iteration 2
12+
dp[i] : Max(dp[i-1] + step[i]
13+
14+
'''
15+
# input
16+
import sys
17+
n = int(input())
18+
field = list()
19+
for _ in range(n):
20+
field.append(int(sys.stdin.readline()))
21+
# print(f"field { field} , {len(field)}")
22+
# step : n개 -> 0시작점+ 0~ n-1
23+
flag = 0 # dp[i-1]에서 온 경우 선택: 1 ,dp[i-2] 에서 온 경우 : 0
24+
dp = [0 for _ in range(n)]
25+
# print(f"dp {dp} , {len(dp)}")
26+
27+
if n == 1 :
28+
print(field[0])
29+
elif n== 2 :
30+
print(max(dp[0], 0)+ field[1])
31+
else : #n >= 3
32+
33+
dp[0] =field[0]# i=0 인 경우 -> dp[0] = 첫 번쨰 & ,flag = 0 (시작은 계단으로 안침)
34+
if dp[0] > 0 : # 이전 i-1= 0 을 참조한 경우
35+
flag= 1
36+
dp[1] = max(dp[0], 0)+ field[1]
37+
38+
39+
for i in range(2 , n) :
40+
if flag == 0 : # 이전 dp[i-2] 참조한 경우
41+
#dp[i] = max(dp[i-1] + field[i] ,dp[i-2] + field[i] )
42+
if dp[i-1] > dp[i-2] : # +1 선택
43+
flag = 1
44+
#+2 선택 -> flag = 0
45+
dp[i] = max(dp[i-1], dp[i-2]) + field[i]
46+
elif flag == 1 : # 이전 dp[i-1] 참조한 경우
47+
# 무조건 +2 만 가능 -> flag = 0
48+
flag = 0
49+
dp[i] = dp[i-2] + field[i]
50+
51+
#dp[-1] : 시작~ 도착 지점까지 얻을 수 있는 점수 최대값
52+
print(dp[-1])

Hongjoo/백준/정수삼각형.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
"""
2+
-top-dowm 방향으로 내려올때 , 각 경로에서 요소들의 최대합을 리스트 dp 에 누적시키기
3+
1, 2중 for 문
4+
2. 모든 경로에 대해 숫자의 누적합을 dp 리스트에 넣기
5+
- 맨 left , right : idx = 0 , -1 경우
6+
=> dp[stage][0] =dp[stage-1][0] + graph[stage][0]
7+
=> dp[stage][-1] =dp[stage-1][-1] + graph[stage][-1]
8+
- 가운데 [idx : 1~ state-1]
9+
=> dp[stage][idx] = max(dp[stage-1][idx] + graph[stage][idx-1] , dp[stage-1][idx] + graph[stage][idx] )
10+
11+
[7]
12+
[10,15]
13+
8 1 0
14+
[18] , [11vs 16 = 16] , [15+0]
15+
2 7 4 4
16+
[18 +2] [18 + 7 vs 16 + 7] [] [15+ 4]
17+
18+
"""
19+
import sys
20+
#1. input
21+
n = int(sys.stdin.readline())
22+
graph= []
23+
for i in range(n) :
24+
tmp = list(map(int, sys.stdin.readline().split()))
25+
graph.append(tmp)
26+
# 2. Initialize List dp
27+
28+
dp = [graph[0]]
29+
30+
#3. dynamic programing
31+
32+
for stage in range(1,n) :
33+
tmp = []
34+
num_list = graph[stage] # add
35+
36+
for idx in range(len(num_list)) :
37+
total_sum = 0
38+
if idx == 0 : # left
39+
total_sum = dp[stage-1][0] + num_list[0]
40+
elif idx < len(num_list)-1: # middle
41+
total_sum = max(dp[stage-1][idx-1] + num_list[idx], dp[stage-1][idx] + num_list[idx])
42+
else: # idx == -1: #right
43+
total_sum = dp[stage-1][-1] + num_list[-1]
44+
tmp.append(total_sum)
45+
46+
dp.append(tmp)
47+
48+
49+
answer = max(dp[-1])
50+
print(f"{answer}")
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
D = int(input()) # 산책할 총 시간 D분
2+
dp = [0] * 8 # 건물 8개에 대해 경로 수를 저장할 배열 초기화
3+
dp[0] = 1 # 정보과학관(0번 건물)에서 출발하므로 초기값은 1
4+
5+
# D분 동안 경로 수를 계산
6+
for i in range(D):
7+
tmp = [0] * 8 # 이번 시간의 경로 수를 임시 저장할 배열
8+
9+
# 각 건물에 대해 이전 시간에 가능한 경로 수를 누적
10+
tmp[0] = dp[1] + dp[2] # 정보과학관으로 가는 경로
11+
tmp[1] = dp[0] + dp[2] + dp[3] # 전산관으로 가는 경로
12+
tmp[2] = dp[0] + dp[1] + dp[3] + dp[4] # 미래관으로 가는 경로
13+
tmp[3] = dp[1] + dp[2] + dp[4] + dp[5] # 신앙관으로 가는 경로
14+
tmp[4] = dp[2] + dp[3] + dp[5] + dp[6] # 한경직기념관으로 가는 경로
15+
tmp[5] = dp[3] + dp[4] + dp[7] # 형남공학관으로 가는 경로
16+
tmp[6] = dp[4] + dp[7] # 진리관으로 가는 경로
17+
tmp[7] = dp[5] + dp[6] # 학생회관으로 가는 경로
18+
19+
# tmp에 저장된 값을 dp로 옮기며, 큰 수를 방지하기 위해 모듈러 연산
20+
for i in range(8):
21+
dp[i] = tmp[i] % 1000000007
22+
23+
# D분 후에 다시 정보과학관(0번 건물)에 도착하는 경우의 수 출력
24+
print(dp[0])
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
n = int(input()) # 10진수
5+
result = '' # -2진법 숫자를 저장할 문자열
6+
7+
# 예외처리 / 0인 경우 바로 종료
8+
if n == 0:
9+
print(0)
10+
exit()
11+
12+
# n이 0이 될 때까지 반복
13+
while n != 0:
14+
if n % (-2) == 0:
15+
result += '0'
16+
n //= (-2)
17+
else:
18+
result += '1'
19+
n = n // (-2) + 1
20+
21+
print(result[::-1])
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
li = list(map(int, input().split()))
5+
6+
while li != [1, 2, 3, 4, 5]: # 최종적으로 1, 2, 3, 4, 5가 될 때까지 반복
7+
for i in range(4): # 0번 인덱스부터 3번 인덱스까지 인접한 두 조각 비교
8+
if li[i] > li[i + 1]: # 앞의 조각이 뒤의 조각보다 크면 교환
9+
li[i], li[i + 1] = li[i + 1], li[i]
10+
print(' '.join(map(str, li))) # 교환이 발생할 때마다 출력

0 commit comments

Comments
 (0)