짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다.
예를 들어, 문자열 S = baabaa 라면
b aa baa → bb aa → aa →
의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.
제한조건
문자열의 길이 : 1,000,000이하의 자연수
문자열은 모두 소문자로 이루어져 있습니다.
입출력 예
s
result
baabaa
1
cdcd
0
입출력 예 설명
입출력 예 #1 위의 예시와 같습니다. 입출력 예 #2 문자열이 남아있지만 짝지어 제거할 수 있는 문자열이 더 이상 존재하지 않기 때문에 0을 반환합니다.
나의 풀이
def solution(s):
a=[]
for i in s:
if len(a) == 0:
a.append(i)
else:
if a[-1] == i:
a.pop()
else:
a.append(i)
if len(a) == 0:
return 1
else:
return 0
1. 스택 원리를 이용해 리스트의 마지막 값과 들어가려는 값이 같으면 두 알파벳을 제거합니다.
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.
제한조건
arr은 길이 1이상, 15이하인 배열입니다.
arr의 원소는 100 이하인 자연수입니다.
입출력 예
arr
result
[2,6,8,14]
168
[1,2,3]
6
나의 풀이
def solution(arr):
m=max(arr)
while True:
c =0
for i in arr:
if m % i == 0:
c += 1
else:
break
if c == len(arr):
break
m += 1
return m
1. 배열 arr의 가장 큰 값부터 하나씩 증가하며 배열 arr의 값들을 모두 약수로 가지는지 확인합니다.
2. 모두 약수로 가지는 수가 나오면 리턴합니다.
다른 사람의 풀이
import math
def solution(num):
answer = num[0]
for n in num:
answer = (n * answer) // math.gcd(n, answer)
return answer
이진트리에는 4가지 순회방식이 존재합니다. 방식은 각각 다르지만 항상 트리의 루트부터 시작한다는 공통점이 있습니다. 또한 모든 순회 방식은 트리의 모든 노드들을 반드시 1번씩 방문하고 순회를 종료합니다.
1. 전위순회(Preorder Traversal)
전위순회의 순회방법입니다.
현재 노드 n를 먼저 방문합니다.
현재 노드의 왼쪽 서브트리를 순회합니다.
현재 노드의 오른쪽 서브트리를 순회합니다.
전위순회의 순서는 NLR입니다. (N은 현재 노드, L은 왼쪽 서브트리, R은 오른쪽 서브트리)
def preorder(self, n):
if n != None:
print(n.item,' ',end='') # 노드 방문
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
2. 중위순회(Inorder Traversal)
중위순회의 순회방법입니다.
현재 노드의 왼쪽 서브트리를 순회합니다.
현재 노드 n을 방문합니다.
현재 노드의 오른쪽 서브트리를 순회합니다.
중위순회의 순서는 LNR입니다.
def inorder(self, n):
if n != None:
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
print(n.item,' ',end='') # 노드 방문
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
3. 후위순회(Postorder Traversal)
후위순회의 순회방법입니다.
현재 노드의 왼쪽 서브트리를 순회합니다.
현재 노드의 오른쪽 서브트리를 순회합니다.
현재 노드 n을 방문합니다.
후위순회의 순서는 LRN입니다.
def postorder(self, n):
if n != None:
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
print(n.item,' ',end='') # 노드 방문
4. 레벨순회(Level-order Traversal)
레벨순회의 순회방법입니다.
루트가 있는 곳부터 각 레벨마다 좌에서 우로 노드들을 방문합니다.
def levelorder(self, root):
q=[] # 리스트 구현(큐로 사용하기 위해)
q.append(root)
while q:
t=q.pop(0)
print(t.item,' ',end='') # 큐에서 첫 항목 삭제하고 삭제한 노드 방문
if t.left != None:
q.append(t.left) # 왼쪽 자식 큐에 삽입
if t.right != None:
q.append(t.right) # 오른쪽 자식 큐에 삽입
위 트리 형태를 4가지 방법으로 순회해보겠습니다.
이진트리 전체 파이썬 코드입니다.
class Node:
def __init__(self, item):
self.item = item
self.left = None
self.right = None
class BinaryTree():
def __init__(self): # 트리 생성
self.root = None
# 전위순회
def preorder(self, n):
if n != None:
print(n.item,' ',end='') # 노드 방문
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
# 중위순회
def inorder(self, n):
if n != None:
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
print(n.item,' ',end='') # 노드 방문
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
# 후위순회
def postorder(self, n):
if n != None:
if n.left:
self.preorder(n.left) # 왼쪽 서브트리 순회
if n.right:
self.preorder(n.right) # 오른쪽 서브트리 순회
print(n.item,' ',end='') # 노드 방문
# 레벨순회
def levelorder(self, root):
q=[] # 리스트 구현(큐로 사용하기 위해)
q.append(root)
while q:
t=q.pop(0)
print(t.item,' ',end='') # 큐에서 첫 항목 삭제하고 삭제한 노드 방문
if t.left != None:
q.append(t.left) # 왼쪽 자식 큐에 삽입
if t.right != None:
q.append(t.right) # 오른쪽 자식 큐에 삽입
def height(self, root):
if root == None:
return 0
# 루트 노드를 기준으로 두 자식노드의 높이 중 큰 높이
return max(self.height(root.left), self.height(root.right)) + 1
tree=BinaryTree()
n1=Node(10)
n2=Node(20)
n3=Node(30)
n4=Node(40)
n5=Node(50)
n6=Node(60)
n7=Node(70)
n8=Node(80)
# 트리 만들기
tree.root=n1
n1.left=n2
n1.right=n3
n2.left=n4
n2.right=n5
n3.left=n6
n3.right=n7
n4.left=n8
# 출력>>트리 높이 : 4
print('트리 높이 :', tree.height(tree.root))
# 출력>>전위순회 : 10 20 40 80 50 30 60 70
print('전위순회 : ',end='')
tree.preorder(tree.root)
# 출력>>중위순회 : 20 40 80 50 10 30 60 70
print('\n중위순회 : ',end='')
tree.inorder(tree.root)
# 출력>>후위순회 : 20 40 80 50 30 60 70 10
print('\n후위순회 : ',end='')
tree.postorder(tree.root)
# 출력>>레벨순회 : 10 20 30 40 50 60 70 80
print('\n레벨순회 : ',end='')
tree.levelorder(tree.root)
JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.
제한조건
s는 길이 1 이상인 문자열입니다.
s는 알파벳과 공백문자(" ")로 이루어져 있습니다.
첫 문자가 영문이 아닐때에는 이어지는 영문은 소문자로 씁니다. ( 첫번째 입출력 예 참고 )
입출력 예
s
return
3people unFollowed me
3people Unfollowed Me
for the last week
For The Last Week
나의 풀이
def solution(s):
s=list(s.lower())
if s[0].isalpha() is True:
s[0]=s[0].upper()
for i in range(1,len(s)):
if s[i-1] == ' ' and s[i].isalpha() is True:
s[i]=s[i].upper()
return ''.join(s)
s.split()과 s.title()을 이용해 간단한 문제인 줄 알았는데 문자열 s에 공백이 연달아 나올 수 있다는 예외가 있었습니다.
1. 문자열 s를 소문자로 바꾸고 리스트로 만듭니다.
2. 문자열 첫번째 자리가 알파벳인 경우 대문자로 바꿉니다.
3. 두번째 문자열 자리부터 앞자리에 공백이 있고 뒷자리가 알파벳이면 단어의 첫 문자인 것을 알 수 있기 때문에 이럴 경우 해당 문자열을 대문자로 바꿉니다.
길이가 같은 배열 A, B 두개가 있습니다. 각 배열은 자연수로 이루어져 있습니다. 배열 A, B에서 각각 한 개의 숫자를 뽑아 두 수를 곱합니다. 이러한 과정을 배열의 길이만큼 반복하며, 두 수를 곱한 값을 누적하여 더합니다. 이때 최종적으로 누적된 값이 최소가 되도록 만드는 것이 목표입니다. (단, 각 배열에서 k번째 숫자를 뽑았다면 다음에 k번째 숫자는 다시 뽑을 수 없습니다.)
예를 들어 A = [1, 4, 2] , B = [5, 4, 4] 라면
A에서 첫번째 숫자인 1, B에서 두번째 숫자인 5를 뽑아 곱하여 더합니다. (누적된 값 : 0 + 5(1x5) = 5)
A에서 두번째 숫자인 4, B에서 세번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 5 + 16(4x4) = 21)
A에서 세번째 숫자인 2, B에서 첫번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 21 + 8(2x4) = 29)
즉, 이 경우가 최소가 되므로 29를 return 합니다.
배열 A, B가 주어질 때 최종적으로 누적된 최솟값을 return 하는 solution 함수를 완성해 주세요.
제한조건
배열 A, B의 크기 : 1,000 이하의 자연수
배열 A, B의 원소의 크기 : 1,000 이하의 자연수
입출력 예
A
B
answer
[1, 4, 2]
[5, 4, 4]
29
[1,2]
[3,4]
10
입출력 예 설명
입출력 예 #1 문제의 예시와 같습니다.
입출력 예 #2 A에서 첫번째 숫자인 1, B에서 두번째 숫자인 4를 뽑아 곱하여 더합니다. (누적된 값 : 4) 다음, A에서 두번째 숫자인 2, B에서 첫번째 숫자인 3을 뽑아 곱하여 더합니다. (누적된 값 : 4 + 6 = 10) 이 경우가 최소이므로 10을 return 합니다.
나의 풀이
def solution(A,B):
A.sort()
B.sort(reverse=True)
c=0
for i,j in zip(A,B):
c += i*j
return c
1. 입출력 예시 설명을 통해 최솟값을 만들기 위해서는 리스트 A의 가장 작은 원소와 리스트 B의 가장 큰 원소부터 곱해야 한다고 생각했습니다. 2. A는 오름차순으로 정렬하고 B는 내림차순으로 정렬합니다.
3. A와 B의 각 원소를 곱해 누적하여 더합니다. 최종적으로 누적된 값 c를 리턴합니다.