
1) 카탈랑 수는 0번, 1번, 2번, ... 순으로 아래와 같이 구성되는 수열을 의미한다.
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …
이를 점화식으로 나타내면 아래와 같다.

카탈랑 수의 n 번째 값을 구하는 프로그램을 작성하세요.
def solution(n):
if n == 0:
return 1
value = 0
for i in range(n):
value += solution(i) * solution(n-i-1)
return value
if __name__ == '__main__':
N = 7
sol = solution(N)
print(sol)
2) 회문 또는 팰린드롬(palindrome)은 앞 뒤 방향으로 같은 순서의 문자로 구성된 문자열을 말한다.
예시) 'abba', 'kayak', 'madam'
유사회문은 문자열 그 자체는 회문이 아니지만 한 문자를 삭제하면 회문이 되는 문자열을 말한다.
예시) 'summuus'의 5번째 또는 6번째 문자 'u'를 제거하면 'summus'인 회문을 만들 수 있다.
주어진 문자열을 확인한 후 문자열 종류에 따라 다음과 같이 출력하는 프로그램을 작성하세요.
회문: 0
유사회문: 1
기타: 2
def solution(s):
def solve(l, r, k):
if l >= r:
return 0
if s[l] == s[r]:
return solve(l+1, r-1, k)
elif k > 0:
if solve(l+1, r, k-1) == 0 or solve(l, r-1, k-1) == 0:
return 1
return 2
return solve(0, len(s)-1, 1)
if __name__ == '__main__':
s = 'abba'
sol = solution(s)
print(sol)
s = 'summuus'
sol = solution(s)
print(sol)
s = 'xabba'
sol = solution(s)
print(sol)
s = 'xabbay'
sol = solution(s)
print(sol)
s = 'comcom'
sol = solution(s)
print(sol)
s = 'comwwmoc'
sol = solution(s)
print(sol)
s = 'comwwtmoc'
sol = solution(s)
print(sol)
3) 하노이의 탑

하노이의 탑 퍼즐 게임 규칙은 다음과 같다.
원판의 개수 n 이 주어졌을 때, 가장 왼쪽 기둥으로부터 끝 기둥으로 이동하는 과정을 출력하는 프로그램을 구현하세요.
단, 초기에 모든 원판은 가장 큰 원판부터 순서대로 왼쪽 기둥에 위치해 있다.
def solution(n):
def solve(n, start, end, temp):
if n == 1:
return [[start, end]]
return solve(n-1, start, temp, end) + [[start, end]] + solve(n-1, temp, end, start)
return solve(n, 1, 3, 2)
if __name__ == '__main__':
n = 3
sol = solution(n)
print(sol)









1) 당신은 학교에서 선생님으로 일하고 있다. 어느날 학생의 성적를 관리하는 프로그램을 제작해 달라는 의뢰를 받았다.
총 N명의 학생의 성적을 관리하고자 한다. 이 때 i번째 학생(0 <= i < N)의 학년이 grade[i], 반이 class_name[i], 점수가 score[i]에 기록되어 있다.
이 때, 학생의 점수를 아래와 같은 조건에 맞게 정렬하여 출력하시오.
grade = [3, 2, 1, 2, 1, 3, 2]class_name = [1, 3, 2, 3, 1, 3, 3]score = [50, 40, 66, 80, 100, 42, 99][100, 66, 99, 80, 40, 50, 42]def solution(grade, class_name, score):
items = [(g, c, -s, s) for g, c, s in zip(grade, class_name, score)]
items.sort()
return list(map(lambda x: x[-1], items))
if __name__ == '__main__':
grade = [3, 2, 1, 2, 1, 3, 2]
class_name = [1, 3, 2, 3, 1, 3, 3]
score = [50, 40, 66, 80, 100, 42, 99]
sol = solution(grade, class_name, score)
print(sol)
2) 문자열 s가 있을 때, 이 문자열을 재배치하여 만든 문자열을 '애너그램'이라고 한다.
예를 들어, "fine"은 "infe"의 애너그램이라고 할 수 있다.
s가 영문 소문자로만 이루어져 있다고 할 때, 문자열 t가 문자열 s의 애너그램인지 판단하는 프로그램을 작성하시오.
s = "imfinethankyou"t = "atfhinemnoyuki"Truedef solution(s, t):
if len(s) != len(t):
return False
s_sorted_list = sorted(list(s))
t_sorted_list = sorted(list(t))
for s_, t_ in zip(s_sorted_list, t_sorted_list):
if s_ != t_:
return False
return True
if __name__ == '__main__':
s = "imfinethankyou"
t = "atfhinemnoyuki"
sol = solution(s, t)
print(sol)
3) 당신은 천재적인 두뇌를 가진 개발자끼리 겨루는 '제로 지니어스' 프로그램에 참가하게 되었다.
'제로 지니어스' 프로그램에서는 주어진 숫자를 이어붙여 가장 큰 수를 만드는 프로그램을 작성하는 미션이 주어졌다.
문제의 조건은 아래와 같다.
0 또는 양의 정수가 numbers 배열로 주어진다.numbers 배열에 주어진 정수를 이어붙여 만들 수 있는 가장 큰 수를 출력한다.[6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210이다.numbers = [3, 30, 34, 5, 9]"9534330"from functools import cmp_to_key
def solution(numbers):
def compare(x, y):
a = int(str(x) + str(y))
b = int(str(y) + str(x))
return 1 if b > a else -1
key = cmp_to_key(compare)
numbers.sort(key=key)
return ''.join(map(str, numbers))
if __name__ == '__main__':
numbers = [3, 30, 34, 5, 9]
sol = solution(numbers)
print(sol)
이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다