https://covenant.tistory.com/224
원래 풀던 프로그래머스 연습 kit가 끝나서 백준으로 넘어가기로 했다.
위 글을 참고하여 순서대로 쭉 풀기로 결정했다.
이번 주는 준비운동part의 브론즈 문제만 풀기로 해서 쉬운 편이다.
1. 약수구하기
https://www.acmicpc.net/problem/2501
def f(a,b):
n = 1
cnt = 0
while a >= n:
if a % n == 0:
cnt += 1
if cnt == b:
return n
n += 1
return 0
a, b = map(int, input().split())
print(f(a,b))
백준은 학교 oj처럼 함수로 입력이 들어오지 않기때문에 직접 입력을 받고 출력도 직접해주는 방식이다.
개인적으로 프로그래머스를 풀다오니 좀 불편하게 느껴졌다.
2. 이진수
https://www.acmicpc.net/problem/3460
def f(n):
i = 1
while n//i > 0:
i *= 2
i /= 2
str = ''
while n > 0:
if n >= i:
str += '1'
n -= i
else:
str += '0'
i /= 2
while i >= 1:
str += '0'
i /= 2
return str
a = int(input())
for i in range(a):
n = int(input())
for idx, i in enumerate(reversed(f(n))):
if i == '1':
print(str(idx) + ' ', end='')
print()
내장함수 쓰지 말고 구현해보라고 해서 직접 해봤다.
별 생각 없이 수학시간때 하던 방식 그대로 구현했는데,, 아래처럼 n//2을 해서 구하는 방법이 훨씬 효율적이다.
t = int(input())
for _ in range(t):
n = int(input())
i = 0
while n > 0:
if n%2 == 1:
print(i, end=' ')
n = n//2
i += 1
3. 최소, 최대
https://www.acmicpc.net/problem/10818
n = int(input())
data = list(map(int, input().split()))
min_ = max_ = data[0]
for i in range(1, n):
a = data[i]
if max_ < a:
max_ = a
if min_ > a:
min_ = a
print(min_, max_)
4. 지능형 기차 2
https://www.acmicpc.net/status?user_id=cme10575&problem_id=2460&from_mine=1
max_ = p = 0
for t in range(10):
o, i = map(int, input().split())
p -= o
if p > max_:
max_ = p
p += i
if p > max_:
max_ = p
print(max_)
5. 피보나치 수 5
https://www.acmicpc.net/problem/10870
n = int(input())
if n == 0:
print(0)
else:
a = 0
b = 1
c = a + b
for i in range(1, n):
c = a + b
a = b
b = c
print(c)
0일때 처리 안해줘서 틀렸었다.
6. 일곱 난쟁이
https://www.acmicpc.net/problem/2309
def comb(arr, n):
result =[]
if n == 0:
return [[]]
for i in range(0, len(arr)):
elem = arr[i]
rest_arr = arr[i + 1:]
for c in comb(rest_arr, n-1):
result.append([elem]+c)
return result
arr = []
for i in range(9):
arr.append(int(input()))
combs = comb(arr, 7)
for c in combs:
if sum(c) == 100:
c.sort()
for i in c:
print(i)
break
itertools 을 사용하는 대신 직접 구현해보았다.
sort()도 사용하지 않고 직접 구현할까 고민하다가 그건 오바인거같아서 그만뒀다.
def dfs_comb(lst,n):
ret = []
idx = [i for i in range(len(lst))]
stack = []
for i in idx[:len(lst)-n+1]:
stack.append([i])
while len(stack)!=0:
cur = stack.pop()
for i in range(cur[-1]+1,len(lst)-n+1+len(cur)):
temp=cur+[i]
if len(temp)==n:
element = []
for i in temp:
element.append(lst[i])
ret.append(element)
else:
stack.append(temp)
return ret
이건 dfs로 조합을 구하는 코드이다.
'알고리즘 스터디' 카테고리의 다른 글
[백준] 13549 숨바꼭질 3 파이썬 (0) | 2021.09.28 |
---|---|
[백준] 준비운동 Part1. 튼튼한 기본기2 (0) | 2021.09.25 |
[프로그래머스] 그래프 3. 방의 개수 (0) | 2021.09.04 |
[프로그래머스] 이분탐색 2. 징검다리 (0) | 2021.08.26 |
[프로그래머스] DFS/BFS 4. 여행경로 (0) | 2021.08.20 |