Skip to content

Commit 435cc6f

Browse files
authored
Merge pull request #225 from AlgorithmStudy-Allumbus/hongjoo
Hongjoo/6월 3주차/ 7문제
2 parents fbe0c81 + bb013a4 commit 435cc6f

File tree

8 files changed

+325
-0
lines changed

8 files changed

+325
-0
lines changed

Hongjoo/lv2/다음큰숫자.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""
2+
https://programmers.co.kr/learn/courses/30/lessons/12911
3+
"""
4+
def solution(n):
5+
answer= 0
6+
bin_flag= True
7+
one = list(str(bin(n))).count("1")
8+
while bin_flag :
9+
n+=1
10+
bin_flag = not(str(bin(n))[2:].count("1") == one)
11+
answer=n
12+
13+
14+
return answer

Hongjoo/lv2/캐시.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
"""
2+
https://school.programmers.co.kr/learn/courses/30/lessons/17680
3+
"""
4+
5+
def solution(cacheSize, cities):
6+
answer = 0
7+
#1. 모든 도시이름 소문자 -> 대문자로 통일
8+
for c in range(len(cities)):
9+
cities[c]=cities[c].upper()
10+
stack = []
11+
# +예외처리 : chachSize가 0일때 -> answer = 5*dB개수
12+
if cacheSize <= 0 :
13+
return (5*len(cities))
14+
# 2. City 개수만큼 반복
15+
for i in range(len(cities)):
16+
city = cities[i]
17+
cache_miss = True
18+
# 2-1 . Stack에 있을때(cache hit)
19+
for s in range(len(stack)):
20+
if city == stack[s][1] : # stack에 있음
21+
answer += 1 # cache hit 시간 추가
22+
cache_miss = False
23+
stack[s][0] = answer # 데이터 사용 시간 업데이트
24+
25+
#2-2. 위 cache 탐색 후에도 Cache miss 발생
26+
if cache_miss : # Cache miss 남
27+
# [1] cache miss 발생& stack이 not full
28+
answer += 5
29+
if len(stack) < cacheSize:
30+
stack.append([answer,city])
31+
#[2] cache miss 발생 & stack 이 full 한 경우 -> replace 교체 (recently cache)
32+
else :
33+
# stack내에 검색 시간이 가장 이른 db 버리기
34+
stack.sort(key = lambda x : x[0])
35+
stack.pop(0)
36+
# 새로운 data로 교체
37+
stack.append([answer,city])
38+
39+
return answer

Hongjoo/백준/숨바꼭질3.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"""
2+
https://www.acmicpc.net/problem/13549
3+
4+
[BOJ] 숨바꼭질3/골드5/
5+
#promblem
6+
- 이동 방법[t, x] -> [t+1 , x-1] ,[t+1 , x+1] # 걷기/ ``[t , 2*x]``
7+
#flow : BFS (최단 시간 x , 최단 동작 횟수) or DFS
8+
1. node= [현 위치 x , 현 시간 t]
9+
2.이웃한 node - x+1 , x-1 , 2*x
10+
(if , nx = 2*x -> t else :걷기 -> t+1)
11+
IDEA
12+
- 같은 level -> 이동(걷기+ 순간이동) 횟수 동일함
13+
- 궁극적으로 최단 시간 = 최단 경로 , 순간이동을 가장 많이 해야함 (순간이동 우선순위가 높음)
14+
=> 2*x -> x-1, x+1 순으로 다음 node 탐색하기
15+
-> 중복되지만 순간이동으로 도달한 경우 vs 걸어서 도달한 경우를 비교할 때,
16+
"""
17+
18+
import sys
19+
from collections import deque
20+
input = sys.stdin.readline
21+
MAX = 100001
22+
N , K = map(int, input().split())
23+
visited = [MAX] * (MAX+1) # 방문 여부
24+
# 2. BFS로 N-> K 의 모든 경로 찾기
25+
q = deque([N])
26+
visited[N]= 0
27+
28+
while q :
29+
cx= q.popleft()
30+
ct = visited[cx]
31+
if cx == K:
32+
break
33+
for nx in (2*cx , cx-1 , cx+1 ) :
34+
if 0 <= nx < MAX and visited[nx] >= MAX : # nx 의 제한 조건
35+
# 시간 업데이트
36+
if nx == 2*cx :
37+
visited[nx] = visited[cx]
38+
else :
39+
visited[nx] = visited[cx] +1
40+
q.append(nx)
41+
print(visited[K])

Hongjoo/백준/숨바꼭질4.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
N, K = map(int, input().split())
5+
MAX = 100001
6+
# answer = []
7+
#[1] 최단 시간 찾기
8+
visited = [[MAX, MAX] for _ in range(MAX+1)]# level 기입
9+
10+
t= 0
11+
next_node = [N]
12+
q = deque([N])
13+
visited[N] = [t,N] # 도착 시간 , 이전 node 위치 확인
14+
15+
#(예외처리) 출발지 = 도착지 같은 경우
16+
if K != N :
17+
while q :
18+
t+=1
19+
next_node = len(q)
20+
for i in range(next_node) : # 현재 level의 node개수만큼 반복
21+
cx = q.popleft()
22+
# print(f"cx {cx} , {next_node}")
23+
# 만약 목적 달성시 , 끝
24+
for nx in [cx -1 , cx+1 , cx*2]:
25+
if 0<= nx <= MAX and visited[nx][0]>= MAX :
26+
q.append(nx)
27+
visited[nx] = [t, cx]
28+
# 현재 q -> 다음 level 의 노드만 남아있는 상태
29+
# 만약 K을 도달한 경우-> 최단 시간 저장
30+
if visited[K][0]< MAX :
31+
break
32+
print(t)
33+
#[2] 역추적 - 최단 시간 경우 , 경로 추적
34+
re_visited = [K]
35+
pt = K
36+
while pt != N :
37+
_ , pt =visited[pt]
38+
re_visited.append(pt)
39+
40+
print(" ".join(map(str,list(reversed(re_visited)))))
41+

Hongjoo/백준/숨박꼭질.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
MAX = 100000
5+
# 1. N, K 입력변수 입력 받기
6+
N ,K = map(int, input().split())
7+
# 2. N과 K 가 같을 때 , 예외처리
8+
if N == K :
9+
print(0)
10+
exit()
11+
12+
# 3. BFS 로 K까지 도달하는데 최단 거리 출력하기
13+
q = deque([N])
14+
visited = [False] * (MAX + 1)
15+
visited[N] = True
16+
lv = 1
17+
#[1] while 을 최단거리(level) 만큼 반복
18+
while q:
19+
level_size = len(q)
20+
next_lv = []
21+
#[2] 현 lv 의 노드만 BFS 탐색 & 다음 lv 후보군 노드을 enqueue
22+
for _ in range(level_size) :
23+
cx = q.popleft()
24+
for nx in (cx-1 , cx+1 ,2*cx) :
25+
if 0 <= nx <= MAX:
26+
if nx == K : # 목적지 도착
27+
print(lv)
28+
exit()
29+
# 첫 방문
30+
if not visited[nx] :
31+
q.append(nx)
32+
next_lv.append(nx)
33+
# print(f"##{lv}= {level_size} => {next_lv}")
34+
lv +=1
35+
for x in next_lv :
36+
visited[x] = True

Hongjoo/백준/숨박꼭질2.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
"""
2+
# [BOJ] 숩박꼭질 / 골드 4
3+
https://www.acmicpc.net/problem/12851
4+
5+
-문제
6+
goa) 수빈 -> 동생 위치까지 도달하는데 최단"시간" & 경우의 수 (미친?)
7+
# 조건
8+
i. 수빈의 위치 N , 동생 K (1차원)
9+
2. 이동 방법 (현 위치:x ) => 3가지
10+
(1) 걷기 : x-1 , x+1
11+
(2) 순간이동 : 2*x
12+
- 유형: BFS
13+
field[x] = [[걸리는 시간,경우의 수]]
14+
15+
5 17
16+
"""
17+
import sys
18+
from collections import deque
19+
N , K = map(int, sys.stdin.readline().split())
20+
INF = 1000001
21+
field = [[INF,0]]*INF# field[x] = 최단 시간
22+
# BFS 특 : 먼저 방문한 경우가 최단 시간임
23+
q = deque([N])
24+
field[N] = [0,1] # 최단시간 , 경우의 수
25+
26+
while q :
27+
x = q.popleft() # 현 위치
28+
ct , cn =field[x] # 현 위치에서 최단 시간 , 경우의 수
29+
# if field[K][0] < ct : # 종료 조건 :
30+
# break
31+
for nx in [x-1 , x+1 , 2*x]:
32+
if 0<= nx < INF:
33+
#[1] 첫 방문인 경우 : field[nx][1] == 0 -> 최단 시간 업데이트 & q 에 넣기
34+
if field[nx][1] == 0 :
35+
field[nx] = [ct +1 ,cn]
36+
q.append(nx) # 위치 업데이트
37+
# print(f"update {nx} => field[nx] : {field[nx]}")
38+
#[2] 중복 방문인 경우(최단 시간이 같을때)-> field[x][1]누적 경로의 수 추가
39+
elif field[nx][0] == ct +1 :
40+
field[nx][1] += cn
41+
# print(f"## duplicate :{nx} - {field[nx]}")
42+
# 최단 시간이 더 큼 -> 암 것도 없음
43+
44+
print(field[K][0])
45+
print(field[K][1])
46+

Hongjoo/백준/숨박꼭질4.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import sys
2+
from collections import deque
3+
input = sys.stdin.readline
4+
N, K = map(int, input().split())
5+
MAX = 100000
6+
# answer = []
7+
#[1] 최단 시간 찾기
8+
visited = [MAX]* (MAX+1) # level 기입
9+
t= 0
10+
next_node = [N]
11+
q = deque([N])
12+
visited[N] = t
13+
while q :
14+
t+=1
15+
next_node = len(q)
16+
for i in range(next_node) : # 현재 level의 node개수만큼 반복
17+
cx = q.popleft()
18+
# 만약 목적 달성시 , 끝
19+
for nx in [cx -1 , cx+1 , cx*2]:
20+
if 0<= nx <= MAX and visited[nx]>= MAX :
21+
q.append(nx)
22+
visited[nx] = t
23+
# 현재 q -> 다음 level 의 노드만 남아있는 상태
24+
# 만약 K을 도달한 경우-> 최단 시간 저장
25+
if visited[K] <MAX :
26+
# answer.append(t)
27+
break
28+
29+
#[2]역추적K-> N - backtracking , DFS
30+
re_visited = []
31+
stack = deque([[K,t]])
32+
while stack :
33+
cx, ct = stack.pop()
34+
if cx not in re_visited :
35+
re_visited.append(cx)
36+
if cx == N :
37+
break
38+
if cx %2==0 : #짝수면
39+
ad_li = [cx-1,cx+1 , cx//2]
40+
else :
41+
ad_li = [cx-1, cx+1]
42+
# print("##",ad_li , type(ad_li))
43+
for nx in ad_li :
44+
if 0<=nx <=MAX and nx not in re_visited and visited[nx] == ct-1:
45+
stack.append([nx,ct-1])
46+
print(t)
47+
print(" ".join(map(str,list(reversed(re_visited)))))
48+

Hongjoo/백준/이모티콘.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
"""
2+
https://www.acmicpc.net/problem/14226
3+
# 이모티콘 / 골드 4
4+
# goal ) 화면에 S개 이모티콘 만드는데 드는 최소시간 구하기
5+
- 3가지 작업(1sec)로 화면 1개 -> S 개
6+
(1) 화면 속 모든 이모티콘 -> 클립보드에 "복사" <덮어쓰기 - ctrl+c>
7+
(2) 클립보드 속 모든 이모티콘 -> 화면에 "붙여넣기" <추가- ctrl+v>
8+
- 클립보드가 반드시 비어있지 않아야 붙여 넣기 가능
9+
- 클립 보드 속 이모티콘은 일부만 삭제 , 복사 불가
10+
- 붙여넣기 시, 클립보드에 있는 이모티콘 개수가 화면에 추가됨
11+
(3) 화면 속 이모티콘 1개 삭제 <삭제 - delete>
12+
# FLOW : BFS
13+
i.
14+
field = [screen : 화면 속 이모티콘 개수 , Backup: 클립보드 속 이모티콘 개수]
15+
ii. 3가지 작업
16+
[copy]
17+
- Bacup[i] = Screen[i-1] 개수
18+
[put]
19+
if backup[i-1] !=0
20+
- screen[i] = backup[i-1] + screen[i-1]
21+
[delete]
22+
- screen[i] = screen[i-1]
23+
"""
24+
import sys
25+
from collections import deque
26+
input = sys.stdin.readline
27+
28+
S = int(input())
29+
visited = [[False]*1002 for _ in range(1002)]
30+
visited[1][0] = True# visited [screen 개수][클립보드 개수] 조합 시 방문 여부 T/F
31+
32+
q = deque([[1,0,0]]) # screen 개수
33+
# 3가지 각 종류의 작업 이후 화면 속 & 클립보드 속 이모티콘 개수
34+
def function(num , screen , backup ):
35+
if num == 0 : # copy
36+
return screen , screen
37+
elif num == 1 : # put
38+
return screen + backup , backup
39+
elif num == 2: # delete
40+
return screen -1 , backup
41+
# 2. BFS 작업
42+
while q:
43+
cs , cb , ct =q.popleft()
44+
# 목표 달성시-> 끝내기
45+
if cs == S :
46+
break
47+
if cb == 0 :
48+
next_f = [0,2]
49+
else :
50+
next_f = [0,1,2]
51+
52+
for d in next_f :
53+
ns , nb = function(d , cs , cb )
54+
nt = ct+1
55+
#BFS 화면 적합성
56+
if 1<= ns <=1001 and not visited[ns][nb] :
57+
q.append([ns, nb , nt])
58+
visited[ns][nb] = True
59+
60+
print(ct)

0 commit comments

Comments
 (0)