
문제설명
여행가 A는 NxN 크기의 정사각형 공간 위에 서 있습니다. 이 공간은 1x1크기의 정사각형으로 나누어져 있습니다. 가장 왼쪽 위 좌표는 (1,1)이며, 가장 오른쪽 아래 좌표는 (N,N)에 해당합니다. 여행가 A는 상, 하, 좌, 우 방향으로 이동할 수 있으며, 시작 좌표는 항상 (1,1)입니다. 여행가A가 이동할 계획서가 있을 때 최종적으로 도착한 위치는 어디인지 알아보자.
입력조건
5
R R R U D D출력조건 : 여행가A가 최종적으로 도착할 지점의 좌표(x,y)를 공백을 기준으로 출력합니다. (예시: 4 3)
문제해결 아이디어
# 데이터 입력받기
n = int(input())
plans = input().split()
# 구현
# x,y 초기좌표
x, y = 1, 1
# 이동계획을 하나씩 확인
for plan in plans:
# 이동 후 좌표 업데이트
if plan =='L':
x = max(x-1, 1)
elif plan == 'R':
x = min(x+1, n)
elif plan == 'U':
y = max(y-1, 1)
else:
y = min(y+1, n)
# 좌표 출력
print(x, y)
5
R R R U D D
4 3
구현은 비교적 쉽지만 실행시간이 상대적으로 오래 걸리고, 많은 메모리를 사용하므로, 이를 어떻게 구현할지 고민이 필요
블랙잭 고수 김씨는 새로운 블랙잭 규칙을 가지고 게임을 하려고 합니다. 새로운 블랙잭 버전에서 각 카드에는 양의 정수가 쓰여 있습니다. 그 다음, 딜러는 N장의 카드를 모두 숫자가 보이도록 바닥에 놓습니다. 그런 후에 딜러는 숫자 M을 크게 외칩니다. 이제 플레이어는 제한된 시간 안에 N장의 카드 중에서 3장의 카드를 골라야 하며, 플레이어가 고른 카드의 합은 M을 넘지 않으면서 M과 최대한 가깝게 만들어야 이길 수 있습니다.
N장의 카드에 써져 있는 숫자가 주어졌을 때, M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 구해 출력하세요.
입력조건
5 21
5 6 7 8 9출력조건 : M을 넘지 않으면서 M에 최대한 가까운 카드 3장의 합을 출력합니다. (예시 : 21)
문제해결 아이디어
# 데이터 입력
n, m = map(int, input().split())
card_list = list(map(int, input().split()))
5 21
5 6 7 8 9
%%time
# 구현
from itertools import combinations
# 카드 조합 구하기
comb = list(combinations(card_list, 3))
# 조합된 카드의 합과 m과의 차이 구하여 딕셔너리 타입으로 저장
sums = {sum(i):sum(i)-21 for i in comb}
# 딕셔너리에서 차이(value)가 0보다 작은 경우에 대해서
# sum(key)를 리스트로 만들고 이중에 가장 큰 sum을 result로
result = max([k for k, v in sums.items() if v <=0])
result
21
%%time
# 결과값을 0으로 초기화
result = 0
# 재귀함수를 이용하여 구하기
def recur(num_card, total, limit=m):
global result
# total이 limit보다 크면 함수 종료
if total > limit:
return
# num_card가 3이 되었을때 result를 업데이트 (기존 result보다 크고 limit보다 작은 경우에 대해서만)
if num_card == 3:
if total <= limit:
if total > result:
result = total
return
# 카드를 선택해서 다시 자신을 호출 (카드는 추가가 되고, total은 뽑은 카드의 숫자를 더해서)
for i in card_list:
recur(num_card+1, total+i)
recur(0,0,21)
result
21
5 4
1 2
3 4
1 4
2 2# 데이터 입력
n, m = map(int, input().split())
changes = [tuple(map(int, input().split())) for _ in range(m)]
# 구현
basket = list(range(1,n+1))
for i, j in changes:
basket[j-1], basket[i-1] = basket[i-1], basket[j-1]
result = ' '.join(map(str, basket))
result
5 4
1 2
3 4
1 4
2 2
3 1 4 2 5
# 데이터 입력
n = int(input())
# 구현
# 한수여부 파악하는 함수
def is_hansu(n):
# 한자리와 두자리수는 모두 한수
if n <100:
return True
#세자리수 이상
digits = list(map(int, str(n)))
differ = digits[1] - digits[0] #차이에 대하여 초기값 지정
for i in range(2, len(digits)):
if digits[i] - digits[i-1] != differ:
return False
return True
def count_hansu(n):
count = 0
for i in range(1, n+1):
if is_hansu(i):
count += 1
return count
result = count_hansu(n)
result
110
99
stack =[]
# push (추가)
stack.append(5)
stack.append(2)
stack.append(3)
stack.append(7)
# pop (제거)
print(stack.pop())
# peek (가장 위의 요소 확인)
print(stack[-1])
# 원소값 출력
print(stack)
print(list(reversed(stack)))
print(stack[::-1])
7
3
[5, 2, 3]
[3, 2, 5]
[3, 2, 5]
from collections import deque
queue = deque()
# enqueue (추가)
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
# dequeue (제거)
print(queue.popleft())
# peek (가장 앞에 있는 요소 확인)
print(queue[0])
# 원소값 출력
print(queue)
queue.reverse()
print(queue)
# print(deque(reversed(queue)))
5
2
deque([2, 3, 7])
deque([7, 3, 2])
from collections import deque
deque = deque()
# endeque (추가)
deque.append(5)
deque.appendleft(2)
deque.append(3)
deque.appendleft(7)
# dedeque (제거)
print(deque.pop())
print(deque.popleft())
# peek (가장 앞에 있는 요소 확인)
print(deque[0])
# 원소값 출력
print(deque)
deque.reverse()
print(deque)
# print(deque(reversed(deque)))
3
7
2
deque([2, 5])
deque([5, 2])

# 전위 순회 알고리즘
def preorder_traverse(Tree T):
if T:
visit(T)
preorder_traverse(T.left)
preorder_traverse(T.right)
# 중위 순회 알고리즘
def inorder_traverse(Tree T):
if T:
inorder_traverse(T.left)
visit(T)
inorder_traverse(T.right)
# 후위 순회 알고리즘
def postorder_traverse(Tree T):
if T:
postorder_traverse(T.left)
postorder_traverse(T.right)
visit(T)
이진 트리에 각 노드 번호를 배열의 순서에 따라 부여
루트의 번호를 1로 함
레벨n에 있는 노드에 대하여 왼쪽부터 오른쪽으로 부터 까지 번호를 차례로 부여
노드 번호의 성질
노드번호를 배열의 인덱스로 사용
높이가 h인 이진트리를 위한 배열의 크기 : ➡ 높이가 클 경우, 배열의 크기 기하급수적으로 커짐
두개의 배열을 이용하는 방법
부모번호를 인덱스로, 자식번호를 저장

자식번호를 인덱스로, 부모번호를 저장

링크드 표현법

13
1 2 1 3 2 4 3 5 3 6 4 7 5 8 5 9 6 10 6 11 7 12 11 13# 데이터 입력
n = int(input())
array = list(map(int, input().split()))
# 자식(left, right)를 리스트로 갖는 이진트리 구현
left = [0]*(n+1)
right = [0]*(n+1)
for i in range(0, len(array), 2):
parent, child = array[i], array[i+1]
if left[parent] == 0:
left[parent] = child
else:
right[parent] = child
# 전위 순회(VLR)
def preorder(node):
if node == 0:
return
else:
print(node, end=' ')
preorder(left[node])
preorder(right[node])
preorder(1)
13
1 2 1 3 2 4 3 5 3 6 4 7 5 8 5 9 6 10 6 11 7 12 11 13
1 2 4 7 12 3 5 8 9 6 10 11 13
7
1 6
6 3
3 5
4 1
2 4
4 74
6
1
3
1
4# 데이터 입력
n = int(input())
links = [tuple(map(int, input().split())) for _ in range(n-1)]
# 부모를 리스트로 갖는 트리 구현
parents = [0]*(n+1)
for i, j in links:
if i == 1: # 1번은 루트로 항상 부모, 그래서 둘중 하나라도 1이있다면 그것은 1의 자식
parents[j] = 1
elif j == 1:
parents[i] = 1
else:
if parents[i] !=0: # 부모는 한명밖에 가질 수 없기 때문에 둘중 하나가 부모가 있다면 그것은 부모가 됨
parents[j] = i
elif parents[j] != 0:
parents[i] = j
# 트리의 부모노드 출력(2부터)
result = '\n'.join(map(str, parents[2:]))
print(result)
7
1 6
6 3
3 5
4 1
2 4
4 7
4
6
1
3
1
4
7
A B C
B D .
C E F
E . .
F . G
D . .
G . .ABDCEFG
DBAECFG
DBEGFCA# 데이터입력
n = int(input())
links = [tuple(input().split()) for _ in range(n)]
# 이진트리 구현
# 노드의 값이 문자이기 때문에 부모노드를 key, 자식을 value로 하는 딕셔너리 형태로 만듬
tree = {}
for n, i, j in links:
tree[n] = (i, j)
## node가 '.'이라면 출력하지 출력하지 않도록 ''을 리턴
## 그렇지 않다면 순회하여 리턴
# 전위 순회(VLR)
def preorder(tree, node):
if node == '.':
return ''
else:
return node + preorder(tree, tree[node][0]) + preorder(tree, tree[node][1]) # V+L+R
# 중위 순회(LVR)
def inorder(tree, node):
if node == '.':
return ''
else:
return inorder(tree, tree[node][0]) + node + inorder(tree, tree[node][1]) # L+V+R
# 후위 순회(LRV)
def postorder(tree, node):
if node == '.':
return ''
else:
return postorder(tree, tree[node][0]) + postorder(tree, tree[node][1]) + node # L+R+V
# 각 순회 결과 출력
print(preorder(tree, 'A'))
print(inorder(tree, 'A'))
print(postorder(tree, 'A'))