Skip to content

Commit d972833

Browse files
authored
Merge pull request #31 from Mingguriguri/minjeong
Minjeong / 6월 1-2주차 / 5문제
2 parents b0dd8de + 2eb9a48 commit d972833

8 files changed

+241
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
def dfs(graph, start, path):
2+
while start in graph and graph[start]: # 시작점이 그래프에 있는지 확인하고, 도착지가 있는지 확인
3+
next_dest = graph[start].pop(0) # 알파벳 순으로 정렬되어 있으므로 첫 번째 경로를 선택
4+
dfs(graph, next_dest, path) # 재귀적으로 다음 도착지에서 다시 탐색
5+
path.append(start) # 더 이상 갈 곳이 없으면 현재 위치를 경로에 추가
6+
7+
def solution(tickets):
8+
# 그래프 초기화
9+
graph = {}
10+
for u, v in tickets: # 주어진 티켓 정보로 그래프 생성
11+
if u in graph:
12+
graph[u].append(v)
13+
else:
14+
graph[u] = [v]
15+
16+
# 각 출발지의 도착지 리스트를 알파벳 순으로 정렬 (문제 조건에 있음)
17+
for key in graph.keys():
18+
graph[key].sort()
19+
20+
path = [] # 최종 경로를 저장할 리스트
21+
dfs(graph, "ICN", path) # "ICN"에서 무조건 시작해야 함 -> ICN부터 DFS ㅇ탐색
22+
return path[::-1] # 경로를 역순으로 반환
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'''
2+
타겟넘버 - deque를 이용한 BFS 풀이
3+
'''
4+
from collections import deque
5+
6+
def solution(numbers, target):
7+
answer = 0
8+
queue = deque()
9+
n = len(numbers)
10+
# 초기 상태를 큐에 추가. 시작 숫자에서 +와 - 두 가지 경우를 모두 추가
11+
# (이때 인덱스값도 함께 추가) [값, 인덱스] (enqueue 작업)
12+
queue.append([numbers[0], 0]) # 첫 번째 숫자를 더한 경우
13+
queue.append([-1*numbers[0], 0]) # 첫 번째 숫자를 뺀 경우
14+
15+
# 큐가 빌 때까지 반복
16+
while queue:
17+
temp, index = queue.popleft() # dequeue. 큐에서 값을 꺼내서 현재 합과 인덱스 가져옴
18+
index += 1 # 다음 인덱스로 넘어감
19+
# 인덱스가 리스트의 길이보다 작다면,
20+
if index < n:
21+
# 현재 합에 다음 숫자를 더하거나 빼는 두 가지 경우를 큐에 추가
22+
queue.append([temp + numbers[index], index])
23+
queue.append([temp - numbers[index], index])
24+
else: # 다 순회했다면 temp 값과 target값 비교
25+
if temp == target:
26+
answer += 1
27+
return answer
28+
29+
# 예제 1: 숫자 배열 [1, 1, 1, 1, 1]로 목표 값 3을 만드는 방법의 수
30+
numbers = [1, 1, 1, 1, 1]
31+
target = 3
32+
print(solution(numbers, target)) # 결과: 5
33+
34+
# 예제 2: 숫자 배열 [4, 1, 2, 1]로 목표 값 4를 만드는 방법의 수
35+
numbers = [4, 1, 2, 1]
36+
target = 4
37+
print(solution(numbers, target)) # 결과: 2
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
'''
2+
타겟넘버 - stack을 이용한 DFS 풀이
3+
queue 풀이와 같은데 popleft -> pop, queue -> stack으로만 바꿔주면 됨
4+
'''
5+
def solution(numbers, target):
6+
answer = 0
7+
stack = []
8+
n = len(numbers)
9+
# 초기 상태를 스택에 추가. 시작 숫자에서 +와 - 두 가지 경우를 모두 추가
10+
# (이때 인덱스값도 함께 추가) [값, 인덱스] (push)
11+
stack.append([numbers[0], 0]) # 첫 번째 숫자를 더한 경우
12+
stack.append([-1*numbers[0], 0]) # 첫 번째 숫자를 뺀 경우
13+
14+
# 스택이 빌 때까지 반복
15+
while stack:
16+
temp, index = stack.pop() # 스택에서 값을 꺼내서 현재 합과 인덱스 가져옴
17+
index += 1 # 다음 인덱스로 넘어감
18+
# 인덱스가 리스트의 길이보다 작다면,
19+
if index < n:
20+
# 현재 합에 다음 숫자를 더하거나 빼는 두 가지 경우를 스택에 추가
21+
stack.append([temp + numbers[index], index])
22+
stack.append([temp - numbers[index], index])
23+
else: # 다 순회했다면 temp 값과 target값 비교
24+
if temp == target:
25+
answer += 1
26+
return answer
27+
28+
# 예제 1: 숫자 배열 [1, 1, 1, 1, 1]로 목표 값 3을 만드는 방법의 수
29+
numbers = [1, 1, 1, 1, 1]
30+
target = 3
31+
print(solution(numbers, target)) # 결과: 5
32+
33+
# 예제 2: 숫자 배열 [4, 1, 2, 1]로 목표 값 4를 만드는 방법의 수
34+
numbers = [4, 1, 2, 1]
35+
target = 4
36+
print(solution(numbers, target)) # 결과: 2
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
'''
2+
타겟넘버 - 재귀를 이용한 DFS 풀이
3+
'''
4+
5+
def solution(numbers, target):
6+
answer = 0
7+
n = len(numbers)
8+
9+
# dfs를 위한 재귀함수
10+
def dfs(index, result):
11+
nonlocal answer # 바깥 함수의 변수를 사용하기 위해 nonlocal 키워드 사용
12+
13+
if index == n: # 모든 숫자를 다 사용한 경우, 현재 합이 target과 같은지 확인
14+
if result == target:
15+
answer += 1
16+
return
17+
else:
18+
# 현재 합에 다음 숫자를 더하거나 빼는 두 가지 경우로 dfs 함수 호출
19+
dfs(index+1, result+numbers[index]) # 더한 경우
20+
dfs(index+1, result-numbers[index]) # 뺀 경우
21+
22+
dfs(0, 0) # 첫번째 인덱스와 초기합 0
23+
24+
return answer
25+
26+
# 예제 1: 숫자 배열 [1, 1, 1, 1, 1]로 목표 값 3을 만드는 방법의 수
27+
numbers = [1, 1, 1, 1, 1]
28+
target = 3
29+
print(solution(numbers, target)) # 결과: 5
30+
31+
# 예제 2: 숫자 배열 [4, 1, 2, 1]로 목표 값 4를 만드는 방법의 수
32+
numbers = [4, 1, 2, 1]
33+
target = 4
34+
print(solution(numbers, target)) # 결과: 2
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from collections import deque
2+
3+
def bfs(maps, x, y, n, m, visited):
4+
queue = deque()
5+
queue.append((x,y))
6+
7+
while queue:
8+
x, y = queue.popleft()
9+
10+
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]: # 좌,우,하,상
11+
nx, ny = x + dx, y + dy
12+
13+
# maps 범위 안에 있어야 하고, 벽이 아니어야 하고(값이 1이어야 하고), 아직 방문하지 않았다면 탐색
14+
if 0 <= nx < n and 0 <= ny < m and maps[nx][ny] == 1 and visited[nx][ny] == False:
15+
visited[nx][ny] = True
16+
queue.append((nx, ny))
17+
18+
maps[nx][ny] = maps[x][y] + 1 # 값을 +1
19+
20+
# 이때 우측 하단의 상,좌,우의 값이 0이면 경로가 이어질 수 없다.
21+
# 목적지에 도달하지 못할 경우엔 -1 반환
22+
if maps[n-1][m-1] == 1:
23+
return -1
24+
else: # 도달했을 경우 최단 거리 반환
25+
return maps[n-1][m-1]
26+
27+
def solution(maps):
28+
n, m = len(maps), len(maps[0]) # maps의 행과 열의 크기
29+
visited = [[False] * m for _ in range(n)] # 방문여부 리스트
30+
visited[0][0] = True # 시작 지점 방문 표시
31+
32+
# bfs 탐색 시작
33+
answer = bfs(maps, 0, 0, n, m, visited)
34+
return answer
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
def solution(n):
2+
answer = 0
3+
4+
dp = [0] * 2001
5+
dp[1], dp[2] = 1, 2
6+
7+
for i in range(3, n+1):
8+
dp[i] += (dp[i-1] + dp[i-2]) % 1234567
9+
return dp[n]
10+
11+
# test code
12+
a = solution(1)
13+
print(a)
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+
s = input().rstrip() # 문자열
5+
q = int(input()) # 질문 개수
6+
prefix_sum = [[0] * 26] # 누적합 리스트 초기화
7+
8+
# 입력한 문자열에 대한 누적합 구하기
9+
# ord(): 아스키코드 구하는 함수
10+
for i, ch in enumerate(s):
11+
prefix_sum.append(prefix_sum[len(prefix_sum) - 1][:]) # 직전 배열 복사(누적하여 저장 가능)
12+
prefix_sum[i+1][ord(ch) - 97] += 1 # 문자열 위치에서 해당 알파벳이 위치한 자리값 누적합
13+
14+
for _ in range(q):
15+
alpha, start, end = map(str, input().strip().split()) # 문자, 시작, 끝 입력
16+
## 구간합 구하기
17+
# 누적합 - 구간
18+
answer = prefix_sum[int(end)+1][ord(alpha)-97] - prefix_sum[int(start)][ord(alpha)-97]
19+
print(answer)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
def solution(n, words):
2+
done = [words[0]] # 사용한 단어 저장
3+
flag = 0
4+
for i in range(1, len(words)):
5+
# 중복 단어 체크
6+
if words[i] in done:
7+
person = (i % n) + 1
8+
turn = ( i // n) + 1
9+
return [person, turn]
10+
# 끝말잇기 이어지는지 체크
11+
if done[i-1][-1] != words[i][0]:
12+
person = (i % n) + 1
13+
turn = ( i // n) + 1
14+
return [person, turn]
15+
16+
# 조건 통과하면 단어 추가
17+
done.append(words[i])
18+
19+
# 탈락자가 없으면 [0,0] 반환
20+
return [0,0]
21+
22+
23+
'''
24+
GPT
25+
'''
26+
'''
27+
def solution(n, words):
28+
used_words = set() # 이미 사용된 단어를 저장하는 집합
29+
used_words.add(words[0]) # 첫 번째 단어는 미리 저장
30+
for i in range(1, len(words)):
31+
# 중복 단어 사용 여부 체크
32+
if words[i] in used_words:
33+
person = (i % n) + 1
34+
turn = (i // n) + 1
35+
return [person, turn]
36+
# 끝말잇기 규칙 체크 (이전 단어의 마지막 글자와 현재 단어의 첫 글자 비교)
37+
if words[i][0] != words[i-1][-1]:
38+
person = (i % n) + 1
39+
turn = (i // n) + 1
40+
return [person, turn]
41+
# 조건을 모두 통과하면 단어를 집합에 추가
42+
used_words.add(words[i])
43+
# 탈락자가 없으면 [0, 0] 반환
44+
return [0, 0]
45+
46+
'''

0 commit comments

Comments
 (0)