Skip to content

Commit e56f179

Browse files
committed
2 parents 1491c09 + c549cc7 commit e56f179

17 files changed

+473
-0
lines changed

Hongjoo/백준/N과M4.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""
2+
백준 # 15652.N과 M(4)
3+
https://www.acmicpc.net/problem/15652
4+
5+
[문제]
6+
- 자연수 1~ N 중 M 개 고른 수열 => 재귀함수
7+
- 같은 수 중복 사용 , 중복되는 수열은 다중 출력 불가능
8+
- 고른 수열은 오름차순
9+
- 출력은 오름차순 => - 원소가 1~ N임으로 이미 오름차순으로 정렬되어 있음(고려x)
10+
[flow]
11+
1. check 를 mxn 의 행렬로 사용 여부 확인(중복 사용과 중복 수열 방지를 위해)
12+
2. 재귀함수로 조건에 해당하는 함수 출력
13+
- 매개변수 m = result 에 들어간 원소들 개수 = 현재 들어갈 자리수
14+
(1) m == M ,즉 result안에 M 개 들어가 있으면, 출력
15+
(2) m번째 자리에 n이 들어간 경험이 있는지 확인 - check[m][n-1] == 0
16+
-> 사용 가능
17+
조건 2 : 첫 result 원소면 바로 등록
18+
조건 3 : 아니면 , 이전 자리수에 등록된 result 원소 값보다 커야지 등록
19+
- 등록시(result[m] = n) , check에도 사용 중 등록하기( check[m][n-1] = 1)
20+
(3)m+1 인 재귀 함수 수행
21+
(4) m 번째 자리수에서 들어갈 1~N수 탐색 완료하면
22+
-> check[m] 은 모두 0으로 리셋하고, m-1 자리수로 backtracking
23+
24+
"""
25+
26+
import sys
27+
N, M = map(int, sys.stdin.readline().split())
28+
# 1. 변수 정의
29+
result = [0 for _ in range(M)]
30+
check= [[0 for _ in range(N)] for i in range(M) ] # row : m번째 위치 , column : N개 후보군 원소들의 m번째 자리수에 사용 여부
31+
32+
33+
def perm(m) :
34+
if m == M :
35+
print(*result)
36+
else : # m : 0,1,2 ...M-1
37+
for n in range(1, N+1) :
38+
# print(f"before m : {m} /n {n} -> check {check[m]}")
39+
if check[m][n-1] == 0 : # 빈 자리
40+
if (m == 0) or (m < M and n >= result[m-1]) : # 첫번쨰 자리 등록 심사 -> pass
41+
result[m] = n # 사용 중 # 그외의 자리 등록 심사 -> 이전 자리수 <= 현재 자리수 조건 만족(중복 출력 방지)
42+
check[m][n-1] = 1
43+
# print(f"m : {m} /n {n} -> check {check[m]}")
44+
# print(f"result { result}")
45+
perm(m+1)
46+
47+
# m 번째 자리에서 들어갈 1~N수 탐색 완료
48+
# 그러면 check[m] 은 0으로 리셋
49+
check[m] = [0 for j in range(N)]
50+
51+
perm(0)
52+
53+

Hongjoo/백준/N과M_5.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
#15654. N과 M (5)
3+
https://www.acmicpc.net/problem/15654
4+
5+
- N개의 원소들로 구성된 수열 중, 개수가 m개인 수열들 찾기
6+
- 사전순 = 오름차순으로 출력
7+
- 중복되는 수열 => 재귀
8+
# TIL
9+
q = [1,2,3]
10+
print(*q) > 1,2,3 # 한줄로 리스트 원소들 출력 가능
11+
"""
12+
import sys
13+
14+
#0. 입력 받기
15+
N , M = map(int, sys.stdin.readline().split())
16+
# M개의 수열 결과를 저장할 배열
17+
result = [0 for _ in range(M)]
18+
# 해당 원소 사용 여부 check 함수
19+
check = [0 for _ in range(N)]
20+
# n 개 수열 원소 후보군 저장하는 리스트
21+
elements = list(map(int, sys.stdin.readline().split()))
22+
#오름 차순 정렬 for 오름차순 결과 출력
23+
elements.sort()
24+
# print(elements)
25+
26+
# 1. m 개 수열 찾기 by 재귀 함수
27+
"""
28+
def fun(n) :
29+
if 재귀종료 조건
30+
else :
31+
재귀로 다음 스테이지로 넘어가기 전에 실행하는 코드들
32+
fun(n+-1) # 재귀
33+
이전 재귀 함수의 재귀종료 조건 종료 후 실행
34+
35+
"""
36+
37+
# start point
38+
def perm(m) : # m : result 안에 들어가있는 원소 개수 = 넣을 위치
39+
if m == M : # result 개수 같으면 = 재귀 종료 조건
40+
print(*result) # 출력
41+
42+
else :
43+
for i in range(N) : # 더 뽑아야 하면 , N 개 후보군 중에 확인
44+
if check[i] == 0 : #현재 후보원소(i) 사용 가능함
45+
result[m] = elements[i] # result에 등록
46+
check[i] = 1 # 사용중
47+
perm(m+1) # result 에 m+1 개 들어가 있음
48+
check[i] = 0 # 사용 완료
49+
50+
perm(0 )
51+
52+
"""
53+
# (추가)요건 출력된 순열 중에 중복 없이 출력되는 경우
54+
55+
# start point
56+
def perm(m , start_point) : # m : result 안에 들어가있는 원소 개수 = 넣을 위치
57+
if m == M : # result 개수 같으면 = 재귀 종료 조건
58+
print(*result) # 출력
59+
# print(check)
60+
for s in range(start_point+1,N):
61+
check[s] = 0 # 사용 완료
62+
# print(f"현재 ; {check}")
63+
else :
64+
for i in range(N) : # 더 뽑아야 하면 , N 개 후보군 중에 확인
65+
if check[i] == 0 : #현재 후보원소(i) 사용 가능함
66+
result[m] = elements[i] # result에 등록
67+
check[i] = 1 # 사용중
68+
# print(f"업데이트 중 {check}")
69+
perm(m+1, start_point) # result 에 m+1 개 들어가 있음
70+
start_point += 1 # 다음 칸으로 이동
71+
72+
perm(0 , 0)
73+
"""
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
'''
2+
BOJ #20542. 받아 쓰기 (골드3)
3+
https://www.acmicpc.net/problem/20542
4+
유형: Dynamic Programming(DP), 문자열
5+
'''
6+
7+
N, M = map(int, input().split())
8+
inp = input()
9+
answer = input()
10+
11+
dp = [[0] * (M + 1) for _ in range(N + 1)]
12+
13+
for i in range(N + 1):
14+
for j in range(M + 1):
15+
16+
if i == 0 or j == 0:
17+
if i == 0 and j == 0:
18+
continue
19+
# 빈 문자열에서 정답 문자열을 만드는 최소 편집 거리
20+
if i == 0 and j != 0:
21+
dp[i][j] = dp[i][j - 1] + 1
22+
# 빈 문자열에서 답안 문자열을 만드는 최소 편집 거리
23+
if i != 0 and j == 0:
24+
dp[i][j] = dp[i - 1][j] + 1
25+
else:
26+
# 비교 문자가 같은지 아닌지 판단
27+
if inp[i-1] == answer[j-1]:
28+
# 같으면 좌상단 대각선 값을 그대로 가져옴
29+
dp[i][j] = dp[i - 1][j - 1]
30+
else:
31+
# 비교 문자가 달라도 i나 v를 휘갈겨 쓴 경우
32+
if inp[i-1] == 'i':
33+
if answer[j-1] == 'l' or answer[j-1] == 'j':
34+
dp[i][j] = dp[i - 1][j - 1]
35+
continue
36+
elif inp[i-1] == 'v':
37+
if answer[j-1] == 'w':
38+
dp[i][j] = dp[i - 1][j - 1]
39+
continue
40+
41+
# 비교문자가 다른 경우 위, 좌측, 좌상단 대각선 값 중 최소값을 선택한 후 1을 더해준다.
42+
dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1
43+
44+
print(dp[N][M])
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
## 🚀1월 3주차 (1/13) 스터디 발제 주제: Dynamic Programming + 문자열
2+
> 발제자: 조윤상
3+
### 🗂️ 스터디 자료
4+
- PDF: [바로가기](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/main/_WeeklyChallenges/W07-%5BDP%20%2B%20String%5D/Study_BOJ_5582.pdf)
5+
6+
7+
### 📖 문제
8+
- [백준 #5582. 공통 부분 문자열](https://www.acmicpc.net/problem/5582): DP, 문자열 / 골드5
9+
- 정답 코드: [Study_BOJ_5582_공통 부분 문자열.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/main/_WeeklyChallenges/W07-%5BDP%20%2B%20String%5D/Study_BOJ_5582_%EA%B3%B5%ED%86%B5%20%EB%B6%80%EB%B6%84%20%EB%AC%B8%EC%9E%90%EC%97%B4.py)
10+
11+
https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/87e6c86d66c9e3bc4abba2b468f0d09c49a66167/_WeeklyChallenges/W07-%5BDP%20%2B%20String%5D/Study_BOJ_5582_%EA%B3%B5%ED%86%B5%20%EB%B6%80%EB%B6%84%20%EB%AC%B8%EC%9E%90%EC%97%B4.py#L1-L24
12+
13+
14+
### 💻 과제
15+
- [백준 #20542. 받아 쓰기](https://www.acmicpc.net/problem/20542): DP, 문자열 / 골드3
16+
- 정답 코드: [Assignment_BOJ_20542_받아 쓰기.py](https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/87e6c86d66c9e3bc4abba2b468f0d09c49a66167/_WeeklyChallenges/W07-%5BDP%20%2B%20String%5D/Assignment_BOJ_20542_%EB%B0%9B%EC%95%84%20%EC%93%B0%EA%B8%B0.py)
17+
https://github.com/AlgorithmStudy-Allumbus/codingtest_algorithm_study/blob/87e6c86d66c9e3bc4abba2b468f0d09c49a66167/_WeeklyChallenges/W07-%5BDP%20%2B%20String%5D/Assignment_BOJ_20542_%EB%B0%9B%EC%95%84%20%EC%93%B0%EA%B8%B0.py#L1-L44
578 KB
Binary file not shown.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'''
2+
BOJ #5582. 공통 부분 문자열(골드5)
3+
https://www.acmicpc.net/problem/5582
4+
유형: Dynamic Programming(DP), 문자열
5+
'''
6+
7+
string1 = input()
8+
string2 = input()
9+
10+
dp = [[0] * len(string1) for _ in range(len(string2))]
11+
12+
for i in range(len(string2)):
13+
for j in range(len(string1)):
14+
# 두 문자열의 i번째 문자와 j번째 문자가 같을때
15+
if string2[i] == string1[j]:
16+
if i > 0 and j > 0:
17+
dp[i][j] = dp[i-1][j-1] + 1
18+
else:
19+
dp[i][j] = 1
20+
else:
21+
dp[i][j] = 0
22+
23+
# dp테이블에서 최댓값 찾기
24+
print(max(max(row) for row in dp))
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import sys
2+
input = sys.stdin.read
3+
4+
K = int(input())
5+
6+
stack = []
7+
8+
for _ in range(K) :
9+
N = int(input())
10+
if N == 0 :
11+
stack.pop()
12+
else :
13+
stack.append(N)
14+
15+
print(sum(stack))
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import sys
2+
input = sys.stdin.readline
3+
from collections import deque
4+
5+
N = int(input())
6+
cards = deque(range(1, N + 1)) # 1부터 N까지의 숫자를 덱에 저장
7+
8+
while len(cards) > 1:
9+
cards.popleft() # 제일 위의 카드를 버림
10+
cards.append(cards.popleft()) # 그다음 카드를 아래로 옮김
11+
12+
print(cards[0]) # 마지막으로 남은 카드 출력
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import sys
2+
input = sys.stdin.read
3+
4+
data = input().split()
5+
N, K = int(data[0]), int(data[1]) # 멀티탭 구멍 수와 전기 용품 사용 횟수
6+
sequence = list(map(int, data[2:])) # 전기 용품 사용 순서
7+
8+
multitap = [] # 현재 멀티탭 상태
9+
unplug_count = 0 # 플러그를 뽑는 횟수
10+
11+
# 순차적으로 전기용품 사용
12+
for i in range(K):
13+
current = sequence[i]
14+
15+
# 1. 이미 멀티탭에 꽂혀 있는 경우
16+
if current in multitap:
17+
continue # 아무 작업도 하지 않고 넘어감
18+
19+
# 2. 멀티탭에 빈 자리가 있는 경우
20+
if len(multitap) < N:
21+
multitap.append(current) # 새로운 전기용품을 추가함
22+
continue
23+
24+
# 3. 멀티탭이 가득 차 있는 경우: 뽑을 전기 용품 결정
25+
farthest_idx = -1
26+
to_unplug = -1
27+
for plug in multitap:
28+
if plug not in sequence[i:]: # 앞으로 사용되지 않는 플러그
29+
to_unplug = plug
30+
break
31+
else:
32+
# 가장 나중에 사용되는 플러그
33+
idx = sequence[i:].index(plug)
34+
if idx > farthest_idx:
35+
farthest_idx = idx
36+
to_unplug = plug
37+
38+
# 플러그 교체
39+
multitap.remove(to_unplug)
40+
multitap.append(current)
41+
unplug_count += 1
42+
43+
print(unplug_count)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
N = int(input())
5+
fear = list(map(int, input().split()))
6+
fear.sort() # 오름차순 정렬
7+
8+
group = 0 # 그룹 수
9+
member = 0 # 현재 그룹에 포함된 모험가의 수
10+
11+
for i in fear:
12+
# 현재 그룹에 인원 추가
13+
member += 1
14+
if member >= i: # 현재 그룹에 포함된 모험가의 수가 공포도 이상이면 그룹 결성
15+
group += 1
16+
member = 0 # 현재 그룹에 포함된 인원 초기화
17+
18+
print(group)

0 commit comments

Comments
 (0)