Skip to content

Commit e448868

Browse files
authored
Merge pull request #207 from AlgorithmStudy-Allumbus/hongjoo
Hongjoo/4월4주차/5개
2 parents 8cc79a2 + 87180a0 commit e448868

File tree

6 files changed

+188
-0
lines changed

6 files changed

+188
-0
lines changed

Hongjoo/lv2/리코쳇로봇.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
#문제 다 읽고 수도 코드 짜자
3+
- goal) 시작 R => 목표 G 까지 최소 이동 수 구하기(도달 못하면 -1 )
4+
- 상하좌우로 "장애물, 가장자리"에 부딫칠 떄까지 이동 = 1회 이동 => 외곽& 장애물 = field[-1]
5+
- board 는 text로 주어짐 => 2차원 배열로 변환
6+
# flow - BFS : 최단 거리
7+
- 이동 방법
8+
"""
9+
from collections import deque
10+
INF = 1e9
11+
def solution(board):
12+
answer = 0
13+
#1. 필드 board 정보를 2차원 배열로 변환(장애물 -1/ 없음 0 )
14+
N , M = len(board) , len(board[0])
15+
field = [[INF]*M for _ in range(N)]
16+
17+
for i in range(N) :
18+
for j in range(M) :
19+
if board[i][j] == "R":
20+
start = [i,j]
21+
elif board[i][j] == "G":
22+
target = [i,j]
23+
elif board[i][j] == "D":
24+
field[i][j] = -1
25+
# print("break",field[i][j])
26+
#2. 탐색
27+
# print(start , target ,field)
28+
#상하좌우
29+
dy = [-1, 1, 0,0]
30+
dx = [0,0,-1,1]
31+
def move_node(d, start): # 이동 방향 ,출발점
32+
ny , nx = start ; flag = False # flag : 최소 이동 여부(Y/N)
33+
while 0<= ny + dy[d]< N and 0<= nx+dx[d] < M and field[ny + dy[d]][nx+dx[d]] >= 0 : # 장애물, 가장자리x
34+
ny += dy[d] ; nx += dx[d]
35+
flag = True
36+
return ny ,nx , flag
37+
# 시작점 초기화
38+
q= deque([start])
39+
field[start[0]][start[1]] = 0
40+
cnt = 0
41+
while q :
42+
cy,cx = q.popleft()
43+
if [cy,cx] == target : #(옵션)효율성
44+
break
45+
for di in range(4):
46+
cnt += 1
47+
ny,nx,f = move_node(di, [cy,cx])
48+
if f and field[ny][nx] == INF : # 해당 [ny,nx] 에 처음 도착(방문x) & 해당 지점에 이동 가능할 경우
49+
field[ny][nx] = min(field[ny][nx], field[cy][cx]+1)
50+
# min은 필요 없음(BFS로 가장먼저 field에 입력 된 턴수가 최소 이동수 )
51+
# field안에 최소 이동 턴수 기록
52+
q.append([ny,nx])
53+
54+
#3. 출력
55+
answer=field[target[0]][target[1]]
56+
# target지점 값에 업데이트가 없음 -> 도달 못함 : -1 / 최소 이동 턴수
57+
if answer >= INF :
58+
answer = -1
59+
return answer
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
def solution(s):
2+
answer = []
3+
# 1. 문자열 속 모든 "0" 제외하기 & 제외한 0 개수 누적 합
4+
# 2. 남은 문자열 크기의 값을 이진수 변환
5+
#3. 변환된 이진수를 다시 [1]번의 입력으로 넣어 반복(문자열 길이가 1이 될때 까지)
6+
7+
a = 0
8+
rotate = 0
9+
while len(s) > 1 :
10+
cnt = 0
11+
for n in s :
12+
if n == "0" :
13+
a+=1
14+
continue
15+
cnt +=1
16+
17+
s= str(bin(cnt))[2:]
18+
rotate += 1
19+
20+
answer = [rotate , a]
21+
return answer

Hongjoo/lv2/피로도_재시도.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
def solution(k, dungeons):
2+
max_count = 0
3+
def brutefoce(path, life):
4+
nonlocal max_count
5+
for idx in range(len(dungeons)):
6+
# (유망 여부) 조건에 안 맞으면 건너뛰기 : limit 제한 , 중복 탐사 방지
7+
if dungeons[idx][0] <= life and idx not in path:
8+
# 3. 탐색할 노드 선택 - 상태 변화
9+
path.append(idx)
10+
# 4. 재귀 호출(담 단계) - 자식 노드로 이동
11+
brutefoce(path ,life -dungeons[idx][1])
12+
# 5. 선택 취소 - 부모 노드로 복귀
13+
path.pop()
14+
max_count = max(max_count , len(path))
15+
brutefoce([], k )
16+
17+
return max_count

Hongjoo/백준/공유기.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
#1. 입력 변수 + 오름차순 정렬
5+
N , C = map(int, input().split())
6+
arr =sorted([int(input()) for _ in range(N)])
7+
8+
#2. “최소 거리 dist”의 탐색 범위 초기화 # 이진 탐색
9+
start = 1 ; end = arr[-1] - arr[0]
10+
answer = 0 # 최소 거리 중 최대 거리
11+
12+
#3.최소 인접 거리 dist 최대값 찾기
13+
#설치 공유기는 dist이상의 간격으로 설치
14+
while start <= end :
15+
mid = (start+end)//2
16+
cnt = 1 # arr[0]은 설치 시작점
17+
18+
#[1] 최소 인접 거리가 mid 이상으로 "최대 설치 가능 공유기 개수계산"
19+
prev = arr[0] # 이전에 설치한 공유기 위치
20+
for i in range(1,N) :
21+
if arr[i] - prev >= mid : # 공유기 등록
22+
prev = arr[i]
23+
cnt+=1
24+
# 공유기 등록하기엔 dist부족한 경우 -> 다음 arr로 이동
25+
26+
#[2] 최소거리 dist 이분 탐색
27+
# 조건 : 설치한 공유기 개수 Cnt 가 C 이상
28+
# True 경우 , 최소거리 Answer 업데이트, 탐색 범위 (mid+1 : end) 이동
29+
if cnt >= C :
30+
answer = max(answer ,mid)
31+
start = mid+1
32+
# False 경우: 탐색 범위 Lower bound로 이동(start : mid)
33+
else :
34+
end = mid - 1
35+
36+
print(answer)

Hongjoo/백준/공유기설치.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
#1. 입력 변수 + 오름차순 정렬
5+
N , C = map(int, input().split())
6+
arr =sorted([int(input()) for _ in range(N)])
7+
8+
#2. “최소 거리 dist”의 탐색 범위 초기화 # 이진 탐색
9+
start = 1 ; end = arr[-1] - arr[0]
10+
answer = 0 # 최소 거리 중 최대 거리
11+
12+
#3.최소 인접 거리 dist 최대값 찾기
13+
#설치 공유기는 dist이상의 간격으로 설치
14+
while start <= end :
15+
mid = (start+end)//2
16+
cnt = 1 # arr[0]은 설치 시작점
17+
18+
#[1] 최소 인접 거리가 mid 이상으로 "최대 설치 가능 공유기 개수계산"
19+
prev = arr[0] # 이전에 설치한 공유기 위치
20+
for i in range(1,N) :
21+
if arr[i] - prev >= mid : # 공유기 등록
22+
prev = arr[i]
23+
cnt+=1
24+
# 공유기 등록하기엔 dist부족한 경우 -> 다음 arr로 이동
25+
26+
#[2] 최소거리 dist 이분 탐색
27+
# 조건 : 설치한 공유기 개수 Cnt 가 C 이상
28+
# True 경우 , 최소거리 Answer 업데이트, 탐색 범위 (mid+1 : end) 이동
29+
if cnt >= C :
30+
answer = max(answer ,mid)
31+
start = mid+1
32+
# False 경우: 탐색 범위 Lower bound로 이동(start : mid)
33+
else :
34+
end = mid - 1
35+
36+
print(answer)

Hongjoo/백준/랜선자르기.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
K, N = map(int, input().split())
2+
3+
lines = [int(input()) for _ in range(K)]
4+
# 1. 범위 초기화
5+
start = 1
6+
end = max(lines)
7+
#2. 이분 탐색
8+
while start <= end:
9+
mid = (start + end) // 2
10+
cnt = 0
11+
for line in lines:
12+
cnt += line // mid
13+
14+
if cnt < N:
15+
end = mid - 1
16+
else:
17+
start = mid + 1
18+
19+
print(end)

0 commit comments

Comments
 (0)