Skip to content

Commit c123b12

Browse files
authored
Merge pull request #95 from AlgorithmStudy-Allumbus/minjeong
Minjeong / 11월 4주차 / 6문제
2 parents 0dafc60 + 71704ac commit c123b12

9 files changed

+193
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
answer = 0
2+
n = 0
3+
visited = []
4+
5+
6+
def dfs(k, cnt, dungeons):
7+
global answer
8+
# 최대 탐험 횟수 갱신
9+
if cnt > answer:
10+
answer = cnt
11+
12+
# 각 던전에 대해 탐험 시도
13+
for i in range(n):
14+
if k >= dungeons[i][0] and not visited[i]: # 최소 필요 피로도 조건 만족
15+
visited[i] = 1
16+
dfs(k - dungeons[i][1], cnt + 1, dungeons) # 탐험
17+
visited[i] = 0 # 상태 복구 (백트래킹)
18+
19+
20+
def solution(k, dungeons):
21+
global n, visited
22+
n = len(dungeons) # 던전 개수
23+
visited = [0] * n # 방문 여부 초기화
24+
dfs(k, 0, dungeons)
25+
return answer
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
answer = 0
2+
n = 0
3+
visited = []
4+
5+
6+
def dfs(k, cnt, dungeons):
7+
global answer
8+
# 최대 탐험 횟수 갱신
9+
if cnt > answer:
10+
answer = cnt
11+
12+
# 각 던전에 대해 탐험 시도
13+
for i in range(n):
14+
if k >= dungeons[i][0] and not visited[i]: # 최소 필요 피로도 조건 만족
15+
visited[i] = 1
16+
dfs(k - dungeons[i][1], cnt + 1, dungeons) # 탐험
17+
visited[i] = 0 # 상태 복구 (백트래킹)
18+
19+
20+
def solution(k, dungeons):
21+
global n, visited
22+
n = len(dungeons) # 던전 개수
23+
visited = [0] * n # 방문 여부 초기화
24+
dfs(k, 0, dungeons)
25+
return answer
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from itertools import permutations
2+
import math
3+
4+
5+
# 소수 판별 함수
6+
def is_prime_num(n):
7+
if n < 2:
8+
return False
9+
for i in range(2, int(math.sqrt(n)) + 1): # n의 제곱근을 정수화 시켜준 후 + 1
10+
if n % i == 0: # i로 나누어 떨어지면 소수가 아니므로 False 리턴
11+
return False
12+
return True # False가 리턴되지 않고 for문을 빠져나왔다면 소수이므로 True 리턴
13+
14+
15+
# 문제 해결 함수
16+
def solution(numbers):
17+
answer = 0
18+
numbers_list = list(numbers)
19+
prime_set = set()
20+
21+
# 모든 순열 생성
22+
for i in range(1, len(numbers) + 1):
23+
for perm in permutations(numbers_list, i):
24+
prime_set.add(int(''.join(perm)))
25+
26+
prime_set -= {0, 1} # 0 또는 1은 순열 집합에서 제거하기
27+
28+
# 순열 집합에서 소수인 값을 발견하면 +1
29+
for num in prime_set:
30+
if is_prime_num(num):
31+
answer += 1
32+
33+
return answer
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
n = int(input())
2+
3+
# 승패를 기록할 배열
4+
win = [-1] * (n + 1)
5+
6+
# 초기 값 설정
7+
win[1] = 1 # SK
8+
win[2] = 0 # CY
9+
win[3] = 1 # SK
10+
11+
# 점화식으로 승패 계산
12+
for i in range(4, n + 1):
13+
if win[i-1] == 1 or win[i-3] == 1:
14+
win[i] = 0 # CY가 승리
15+
else:
16+
win[i] = 1 # SK가 승리
17+
18+
# 결과 출력
19+
if win[n] == 1:
20+
print("SK")
21+
else:
22+
print("CY")
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 입력 받기
5+
n = int(input())
6+
7+
if n % 2 == 0:
8+
print("CY") # 짝수일 때 CY 승리
9+
else:
10+
print("SK") # 홀수일 때 SK 승리
File renamed without changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 1. 문자열 입력받기
5+
ab_str = input().rstrip()
6+
7+
# 2. a의 개수 계산
8+
a = ab_str.count('a')
9+
10+
# 3. 원형 문자열 처리
11+
ab_str += ab_str # 문자열을 두 배로 늘림
12+
13+
# 4. 슬라이딩 윈도우로 최소 b의 개수 계산
14+
answer = len(ab_str) # 충분히 큰 초기값 설정
15+
for i in range(len(ab_str) // 2):
16+
answer = min(answer, ab_str[i:i+a].count('b')) # b의 개수 최소값 갱신
17+
18+
# 5. 결과 출력
19+
print(answer)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import sys
2+
3+
input = sys.stdin.readline
4+
5+
# 입력 받기
6+
N, S = map(int, input().split())
7+
numbers = list(map(int, input().split()))
8+
9+
# 초기 변수 설정
10+
interval_sum = 0
11+
end = 0
12+
count = N + 1 # 최소 길이 초기값 설정 (최대값)
13+
14+
# 슬라이딩 윈도우 알고리즘
15+
for start in range(N):
16+
# end를 확장하며 구간 합 계산
17+
while interval_sum < S and end < N:
18+
interval_sum += numbers[end]
19+
end += 1
20+
21+
# 부분합이 S 이상이면 최소 길이 갱신
22+
if interval_sum >= S:
23+
count = min(count, end - start)
24+
25+
# 구간 시작점을 이동하며 부분합 감소
26+
interval_sum -= numbers[start]
27+
28+
# 결과 출력 (조건 만족 구간이 없으면 0)
29+
print(0 if count == N + 1 else count)
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sys
2+
input = sys.stdin.readline
3+
4+
# 입력 받기
5+
n = int(input()) # 수열의 크기
6+
numbers = list(map(int, input().split())) # 수열
7+
x = int(input()) # 목표 숫자
8+
9+
# 초기화
10+
left = 0
11+
right = n - 1
12+
count = 0
13+
14+
# 수열 정렬
15+
numbers.sort()
16+
17+
# 투 포인터 탐색
18+
while left < right:
19+
current_sum = numbers[left] + numbers[right]
20+
if current_sum > x:
21+
right -= 1 # 합이 크면 오른쪽 포인터를 왼쪽으로
22+
elif current_sum < x:
23+
left += 1 # 합이 작으면 왼쪽 포인터를 오른쪽으로
24+
else:
25+
count += 1 # 조건 만족
26+
left += 1
27+
right -= 1
28+
29+
# 결과 출력
30+
print(count)

0 commit comments

Comments
 (0)