Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
def binary_search(arr, start, end):

if start > end:
return None
mid = (start + end) // 2
while start <= end:
if arr[mid] == mid:
return mid
elif arr[mid] > mid:
return binary_search(arr, start, mid - 1)
else:
return binary_search(arr, mid + 1, end)


N = int(input())

arr = list(map(int, input().split()))

index = binary_search(arr, 0, N-1)

if index == None:
print(-1)
else:
print(index)
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
from bisect import bisect_left, bisect_right

# 내가 처음 풀었던 풀이
N, x = map(int, input().split())

arr = list(map(int, input().split()))

# 배열에 x가 없는 경우 -1 출력

# 이진 탐색을 이용하여 arr에서 x와 같은 수까지 start와 end를 늘려가다가 더 이상 같이 않을 때 멈추고 start와 end의 길이를 구함

start = 0
end = len(arr) - 1


while start <= end:
# mid = (start + end) // 2
# print(mid)

# start < x
if arr[start] < x:
start += 1
# print("start, end:", start, end)
# if arr[start] == x:
# break
# x < end
if arr[end] > x:
end -= 1
# print("start, end:", start, end)
# if arr[end] == x:
# break
if arr[end] == x and arr[start] == x:
break

print(end - start + 1)
print()

##################################################################################
# 이진 탐색을 이용한 풀이
print("이진 탐색을 이용한 풀이")


def binary_search(arr, x, find_first):
n = len(arr)
start = 0
end = n-1
result = -1

while start <= end:
mid = (start + end) // 2
if arr[mid] < x:
start = mid + 1
elif arr[mid] > x:
end = mid - 1
else:
result = mid
if find_first:
# x가 처음 등장하는 위치를 찾습니다.
end = mid - 1
else:
# x가 마지막으로 등장하는 위치를 찾습니다.
start = mid + 1
return result


N, x = map(int, input().split())

arr = list(map(int, input().split()))

# 이진 탐색으로 첫 번째와 마지막 위치를 찾기
first_position = binary_search(arr, x, True)
last_position = binary_search(arr, x, False)

# 결과 출력
if first_position == -1 or last_position == -1:
print(-1)
else:
print(last_position - first_position + 1)

print()

##################################################################################
# bisect를 활용한 풀이


def count_by_range(arr, left_value, right_value):
right_index = bisect_right(arr, right_value)
left_index = bisect_left(arr, left_value)
return right_index - left_index


N, x = map(int, input().split())

arr = list(map(int, input().split()))

# 값이 [x, x] 범위에 있는 데이터의 개수 계산
count = count_by_range(arr, x, x)

# 값이 x인 원소가 존재하지 않는다면
if count == 0:
print(-1)
# 값이 x인 원소가 존재한다면
else:
print(count)
41 changes: 41 additions & 0 deletions 이코테/07 이진 탐색/떡볶이_떡_만들기/준영.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
N, M = map(int, input().split())
dduck = list(map(int, input().split()))

dduck.sort()

mid = max(dduck) // 2
# print(mid)

for i in range(0, len(dduck)):
sum = 0
res = dduck[i] - mid
sum += res
# print("sum:", sum)
if sum == M:
print(dduck[i])
break

# 정답 코드 (이진 탐색)
start = 0
end = max(dduck)

# 절단 위치
result = 0

while (start <= end):
# 총 잘리는 떡의 길이
total = 0
mid = (start + end) // 2

for i in dduck:
# 절단기 길이보다 떡 길이가 길면 절단 가능
if i > mid:
total += i - mid

if total < M:
end = mid - 1
else:
result = mid
start = mid + 1

print(result)
21 changes: 21 additions & 0 deletions 이코테/08 다이나믹 프로그래밍/1로_만들기/준영.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
X = int(input())

# 1~X까지 각각의 최단 거리를 기록하기 위해 크기가 30000인 배열을 만들고 0으로 초기화한다

arr = [0] * 30001

for i in range(2, X + 1):
# 이전요소까지의 바로 아래 단계까지 가는 거리를 더해주기 위해 1을 더함
arr[i] = arr[i-1] + 1

# 2로 나누어질때
if i % 2 == 0:
arr[i] = min(arr[i], arr[i//2] + 1)
# 3으로 나누어질때
if i % 3 == 0:
arr[i] = min(arr[i], arr[i//3] + 1)
# 5로 나누어질때
if i % 5 == 0:
arr[i] = min(arr[i], arr[i//5] + 1)

print(arr[X])
46 changes: 46 additions & 0 deletions 이코테/09 최단 경로/미래_도시/준영.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import sys
input = sys.stdin.readline

# 무한대 설정
INF = int(1e9)

# 회사의 개수 N, 경로의 개수 M
N, M = map(int, input().split())

company = [[INF] * (N+1) for _ in range(N+1)]
# print(company)

for i in range(1, N + 1):
for j in range(1, N + 1):
if i == j:
company[i][j] = 0

for i in range(M):
x, y = map(int, input().split())
company[x][y] = 1
company[y][x] = 1

# X와 K가 공백으로 구분되어 차례대로 주어진다 (1 <= K <= 100)
X, K = map(int, input().split())

for i in range(N):
for j in range(N):
print(company[i][j], end=' ')
print()

# 여기까지 2차원 리스트에서 자기 자신까지의 거리는 0, 인접한 회사끼리는 1, 두 칸 이상 떨어진 회사는 INF로 초기화

# 다음 과정은 두 칸 떨어진 회사까지의 거리를 테이블에 적용시켜야함

for k in range(1, N + 1):
for a in range(1, N + 1):
for b in range(1, N + 1):
company[a][b] = min(company[a][b], company[a][k] + company[k][b])

# 결과 출력
distance = company[1][k] + company[k][X]

if distance >= INF:
print("-1")
else:
print(distance)