๊ทธ๋์ ๋ฐฐ์ ๋ ์๋ฃ๊ตฌ์กฐ๋ค์ ์ด์ ๋ฌธ์ ์ ์ ์ฉํด ๋ณด์.
1) ํด์
[programmers-Lv1] ์์ฃผํ์ง ๋ชปํ ์ ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
๋ง๋ผํค ๊ฒฝ๊ธฐ์ ์ฐธ์ฌํ ์ฌ๋๊ณผ ์์ฃผํ ์ ์์ ๋ช ๋จ์ด ์ฃผ์ด์ง ๋, ์์ฃผํ์ง ๋ชปํ ์ ์์ ์ด๋ฆ์ ๋ฐํํด๋ผ.(์์ฃผํ์ง ๋ชปํ ์ ์๋ 1๋ช ์ด๋ค)
ํ์ด
- ์ ์์ ์ด๋ฆ์ key๋ก ์ ์์ ์ซ์๋ฅผ value๋ก ํ๋ dict๋ฅผ ๋ง๋ค์ด ์ ์ฅ(๋๋ช ์ด์ธ์ด ์์ ์ ์์ผ๋ฏ๋ก)
- ์์ฃผ ๋ช ๋จ์ ์ด๋ฆ์ด ๋์ค๋ฉด ํด๋น dict[key]๊ฐ์ 1 ๊ฐ์
- ๊ฐ์ด 0์ด ์๋ key ๊ฐ์ ๋ฐํ(=์์ฃผํ์ง ๋ชปํ ์ ์์ด๋ค)
def solution(participant, completion):
print(participant+completion)
d={}
for people in participant:
d[people]=d.get(people, 0)+1
for peopel in completion:
d[peopel]-=1
for key in d.keys():
if d[key]!=0:
return key
2) ํ์๋ฒ
์๊ณ ๋ฆฌ์ฆ์ ๊ฐ ๋จ๊ณ์์ ๊ทธ ์๊ฐ์ ์ต์ ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ต์ ์ ํํ๋ ์๊ณ ๋ฆฌ์ฆ
ํ์ฌ์ ์ ํ์ด ๋ง์ง๋ง ํด๋ต์ ์ต์ ์ฑ์ ํด์น์ง ์์ ๋ ์ฌ์ฉํ๋ค.
[programmers-Lv1] ์ฒด์ก๋ณต
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
์ฒด์ก๋ณต์ด ์์ด์ผ ์ฒด์ก ์์ ์ ๋ค์ ์ ์๋ค.
์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์๋ ํ์์ด ์ฒด์ก๋ณต์ด ์๋ ํ์์๊ฒ ๋น๋ ค์ค ๋, ์ฒด์ก์์ ์ ๋ค์ ์ ์๋ ์ต๋ ํ์์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
(๋จ, ์์ ์ด ์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์์ง๋ง, ์ฒด์ก๋ณต์ ์์ด๋ฒ๋ ธ์ ๊ฒฝ์ฐ์๋ ์์ ์ด ์ฌ์ฉํ๊ณ ๋น๋ ค์ฃผ์ง ์๋๋ค.)
ํ์ด 1
ํ๋์ ๋ฐฐ์ด์ ๋ชจ๋ ํ์์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.(ํธํ๊ฒ ์ธ๋ฑ์ฑ ํ๊ธฐ ์ํด ๋ฆฌ์คํธ ๊ธธ์ด๋ฅผ ์๋ค ํ ์นธ์ฉ ์ถ๊ฐ)
- ์ด๊ธฐ ๋ฐฐ์ด์ ์์๊ฐ์ 1
- ์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์๋ ๊ฒฝ์ฐ +1
- ์ฒด์ก๋ณต์ ์์ด๋ฒ๋ฆฐ ํ์์ ๊ฒฝ์ฐ -1
- ํด๋น ๋ฐฐ์ด์ ๋ํด ๊ฐ์ด 0์ด๋ฉด(์ฒด์ก๋ณต์ด ์์ผ๋ฉด) ์๋ค ํ์์ ๊ฐ์ ํ์ธํด ๋น๋ฆฐ๋ค.
def solution(n, lost, reserve):
student=[1 for i in range(n+2)]
for r in reserve:
student[r]+=1
for l in lost:
student[l]-=1
for idx in range(1, len(student)-1):
if student[idx]==0: #์ข์ฐ ํ์ธ
if student[idx-1]>=2:
student[idx]=1
student[idx-1]-=1
elif student[idx+1]>=2:
student[idx]=1
student[idx+1]-=1
else:
continue
answer=0
for s in student:
if s>=1:
answer+=1
return answer-2
ํ์ด 2
์์ ํ์ด 1์ ํ์์ ์๊ฐ ์ปค์ง๋ฉด ์๊ฐ ๋ณต์ก๋๊ฐ ๋ง์ด ๊ฑธ๋ฆฐ๋ค.
ํ์ธํด์ผ ํ ํ์๋ง ํ์ธํ๋ ๋ฐฉ๋ฒ(lost๋ reserve)
- ์งํฉ(set) ์ด์ฉ : ์๊ธฐ ์์ ์ด ์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์๊ณ , ์ฒด์ก๋ณต์ ์์ด๋ฒ๋ ธ์ผ๋ฉด ๋ ๋ฐฐ์ด์์ ์ญ์
- lost ํ์์ ์ <reserve ํ์์ ์ : lost ๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ํ์ธ
- lost์ ํ์์ ํฌ๊ธฐ ์์ผ๋ก ์ ๋ ฌํ ๋ค, ํด๋น ์์์ ์๋ค ํ์์ด ์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์๋์ง (reserve์ ์์๊ฐ ์๋์ง) ํ์ธ
- lost ํ์์ ์> reserve ํ์์ ์ : reseve ๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ํ์ธ
- reserve์ ํ์์ ํฌ๊ธฐ ์์ผ๋ก ์ ๋ ฌํ ๋ค, ํด๋น ์์์ ์๋ค ํ์์ด ์ฌ๋ถ์ ์ฒด์ก๋ณต์ด ์๋์ง (reserve์ ์์๊ฐ ์๋์ง) ํ์ธ
def solution(n, lost, reserve):
lost, reserve=list(set(lost)-set(reserve)), list(set(reserve)-set(lost))
answer=n-len(lost)
lost.sort(reverse=True)
reserve.sort(reverse=True)
if len(lost)<len(reserve): #lost ๊ธฐ์ค์ผ๋ก ํ์ธ
while len(lost)!=0 and len(reserve)!=0:
minus=lost[-1]-1
plus=lost[-1]+1
lost.pop()
if minus in reserve:
reserve.remove(minus)
elif plus in reserve:
reserve.remove(plus)
else:
continue
answer+=1
else:#Reserve ๊ธฐ์ค์ผ๋ก ํ์ธ
while len(reserve)!=0 and len(lost)!=0:
minus=reserve[-1]-1
plus=reserve[-1]+1
reserve.pop()
if minus in lost:
lost.remove(minus)
elif plus in lost:
lost.remove(plus)
else:
continue
answer+=1
return answer
[programmers-Lv2] ํฐ ์ ๋ง๋ค๊ธฐ
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
์ด๋ค ์์์ k๊ฐ์ ์๋ฅผ ์ ๊ฑฐํ์ฌ ์ป์ ์ ์๋ ์ต๋ ์๋ฅผ ๋ฐํํ์ฌ๋ผ.
ํ์ด
์, ๋ค ์์๋ฅผ ๋น๊ต
- k๊ฐ์ ์์๋ฅผ ๊บผ๋ด๊ฑฐ๋, ๋๊น์ง ๊ฒ์ฌํ์ ๋ ์์ ์์๊ฐ ๋ค์ ์์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์์ผ ํจ
- k ๊ฐ์ ์์๋ฅผ ๊บผ๋ด์ง ๋ชปํ๊ณ ๋ฐ๋ณต๋ฌธ์ด ์ข ๋ฃ๋๋ฉด, ์ ๊ฑฐ๋ ์์ ์์ ์์๊ฐ ๋ค์ ์์๋ณด๋ค ํฌ๋ค๋ ๋ป์ด๋ฏ๋ก ๋ค์์ ๋๋จธ์ง k์๋ฆฌ ์ ๊ฑฐ
def solution(number, k):
if len(number)-k==1:
return max(number)
answer=""
last=[number[0]]
idx=1
while k>0 and idx<len(number):
if last[-1]<number[idx]:
while k>0 and len(last)>0 and last[-1]<number[idx]:
last.pop()
k-=1
last.append(number[idx])
idx+=1
if idx<len(number):
last+=(number[idx:])
if k>0:
last=last[:-(k)]
return ''.join(last)
3) ์ ๋ ฌ
key ์ต์ ์ ์ด์ฉํ๋ฉด ์ํ๋ ๊ธฐ์ค์ ๋ฐ๋ผ ์ ๋ ฌ ์ํฌ ์ ์๋ค.
[programmers-Lv2] ๊ฐ์ฅ ํฐ ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
n๊ฐ์ ์๊ฐ ์ฃผ์ด์ง ๋, ํด๋น ์ซ์๋ฅผ ๋ฐฐ์นํด์ ์ป์ ์ ์๋ ์ต๋ ์๋ฅผ ๋ฐํํ์ฌ๋ผ(์๋ 1000 ์ดํ์ด๋ค.)
ํ์ด 1
์์ [0], [1], [2], [3] ๋ฒ์งธ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํด์ผ ํ๋ค.
def solution(numbers):
str_numbers=[str(num) for num in numbers]
str_numbers.sort(key=lambda x : (x*1000)[:4], reverse=True)
str_numbers=''.join(str_numbers)
return str_numbers if str_numbers[0]!="0" else "0"
4) ํ
ํ์ด์ฌ์ ๋ด์ฅ ์๋ฃํ์ ์ด์ฉํด์ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํด ๋ณด์.
import heapq
์์ฃผ ์ฌ์ฉ๋๋ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
๐ฆheapq.heapify(list) → heap : $O(nlogn)$
list๋ฅผ heap์ผ๋ก ๋ณํ
๐ฆheapq.heappush(heap, item) → None : $O(logn)$
item์ heap์ ์ถ๊ฐ
๐ฆheapq.heappop(heap) → item :$O(logn)$
heap์์ ๊ฐ์ฅ ์์ ์์๋ฅผ pop, ๋น์ด ์๋ ๊ฒฝ์ฐ IndexError๊ฐ ํธ์ถ
[programmers-Lv1] ๋ ๋งต๊ฒ
๋ฌธ์ ๊ฐ์
๋ชจ๋ ์์๋ฅผ ํน์ ๊ฐ ์ด์์ผ๋ก ๋ง๋๋ ค๊ณ ํ๋ค.
ํน์ ๊ฐ ์ดํ์ธ ์์๋ค์ ๋ํด (์ต์๊ฐ+๋ ๋ฒ์งธ ์ต์๊ฐ*2) ์ฐ์ฐ์ ์ํํด์ ํน์ ๊ฐ ์ด์์ผ๋ก ๋ง๋ค๋ ค๊ณ ํ ๋, ์ต์ ์ฐ์ฐ ํ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
์ต์๊ฐ๋ค์ ๊ณ์ ์ป์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ ์๋ฃ๊ตฌ์กฐ(์ต์ํ)๋ฅผ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ณต์ก๋๋ฅผ ์ค์ผ ์ ์๋ค.
ํ์ด
- heap.pop์ ๊ฐ์ด K๋ณด๋ค ํฌ๋ฉด ๋๋จธ์ง ๋ชจ๋ ์์๊ฐ K๋ณด๋ค ํฌ๋ค๋ ์๋ฏธ ์ด๋ฏ๋ก ์ง๊ธ๊น์ง์ ์ฐ์ฐ ํ์๋ฅผ ๋ฐํ
- K๋ณด๋ค ์์ผ๋ฉด, $์ต์๊ฐ1+2*์ต์๊ฐ2$ ์ฐ์ฐ์ ์ํํ ๋ค ์ฝ์
import heapq
def solution(scoville, K):
heapq.heapify(scoville)
answer=0
while len(scoville)!=0:
num1=heapq.heappop(scoville)
if num1>=K:
break
else:
if len(scoville)==0:
return -1
else:
num2=heapq.heappop(scoville)
heapq.heappush(scoville, num1+2*num2)
answer+=1
return answer
5) ๋์ ๊ณํ๋ฒ(Dynamic programming)
์๊ณ ๋ฆฌ์ฆ ์งํ์ ๋ฐ๋ผ ํ์ํด์ผ ํ ๋ฒ์๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํจ์ผ๋ก์จ ํ์ ๋ฒ์๋ฅผ ํ์ ํ ์ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งํ๋ค.
ex) ํผ๋ณด๋์น์์ด, ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด ๋ด๊ธฐ(knapsack)
[programmers-Lv3] N์ผ๋ก ํํ
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
์ด๋ค ์๊ฐ ์ฃผ์ด์ง ๋, ์ด๋ค ์์ ์ฌ์น์ฐ์ฐ๋ง์ ์ด์ฉํด์ ํน์ ๊ฐ์ ๋ง๋ค ๋, ์ด๋ค ์๋ฅผ ์ต์๋ก ์ฌ์ฉ์ ๊ตฌํ์ฌ๋ผ.
ex) 5(์ด๋ค ์), ํน์ ๊ฐ(12) ์ด๋ฉด (55+5)/5 4๋ฒ์ด๋ค.
ํ์ด
๊ทธ์ ์ ์ด๋ค ์๋ฅผ 1, 2, 3,... k๋ฒ ์ด์ฉํด์ ๋ง๋ค ์ ์๋ ์๋ค์ ์ด์ฉํด k+1๋ฒ ์ด์ฉํด์ ๋ง๋ค ์ ์๋ ์งํฉ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํ๋ค.
ex) 5๋ฒ ์ฌ์ฉ = (1, 4), (2, 3) ์ด์ฉ
- dict๋ฅผ ์ด์ฉํด ์ด๋ค ์๋ฅผ k๋ฒ ์ด์ฉํด์ ๋ง๋ค ์ ์๋ ์งํฉ์ ์ ์ฅ
- set์ ์ด์ฉํด ์ค๋ณต๋ ์๋ฅผ ์ ๊ฑฐ
def solution(N, number):
first=[N]
second=list(set([10*N+N, N+N, N-N, N*N, N//N]))
num_dict={1:first, 2:second}
if N==number:
return 1
answer=2
while (number not in num_dict[answer]):
if answer>8:
return -1
now=[]
sum=N
for i in range(1, answer+1):
sum+=N*(10**i)
now.append(sum)
for idx in range(1, (answer+1)//2+1, 1):
prev1=num_dict[idx]
prev2=num_dict[(answer+1)-idx]
for num1 in prev1:
for num2 in prev2:
now.append(num1+num2)
now.append(num1-num2)
now.append(num2-num1)
now.append(num1*num2)
if num2!=0:
now.append(num1//num2)
if num1!=0:
now.append(num2//num1)
answer+=1
num_dict[answer]=list(set(now))
return answer
6) DFS/BFS
DFS : ๊น์ด ์ฐ์ ํ์ with Stack
ํ์ ์ ์์ ์ธ์ ํ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋, ๋์ ์์๋ ธ๋๊น์ง ํ์์ ๋๋ธ ๋ค ๋ค์ ์ ์ ์ผ๋ก ์งํ
BFS : ๋๋น ์ฐ์ ํ์ with Queue
ํ ์ ์ ์์ ์ธ์ ํ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ์ ๋ฐฉ๋ฌธํ๋, ๋ชจ๋ ๊ฐ์ ๋ ๋ฒจ์ ๋ ธ๋ ํ์์ ๋๋ธ ๋ค ๋ค์ ๋ ๋ฒจ๋ก ํ์์ ์งํ
[programmers-Lv3] ์ฌํ๊ฒฝ๋ก
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๋ฌธ์ ๊ฐ์
์ถ๋ฐ์ง์ ๋นํ๊ธฐ์ ํญ๊ณต๊ถ ์ ๋ณด๊ฐ ์ฃผ์ด์ง ๋, ๋ชจ๋ ํญ๊ณต๊ถ์ ์ฌ์ฉํ ๋นํ๊ธฐ์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๋จ, ๊ฐ๋ฅํ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ์ํ๋ฒณ ์์๊ฐ ์์๋ ๊ฒฝ๋ก๋ฅผ ๋ฐํ
ํ์ด
๊น์ด ์ฐ์ ๋ฐฉ์์ ์ด์ฉํ์ฌ ์ต์ ํด๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐํํ๊ฒ ํ๋ค.
- ํญ๊ณต๊ถ์ ์ถ๋ฐ์ง๋ฅผ key๋ก ํ๋ dictionary์ ์ ์ฅํ ๋ค, ์ํ๋ฒณ ์ญ์์ผ๋ก ์ ๋ ฌ(์๊ฐ๋ณต์ก๋๊ฐ $O(n)$์ธ list.pop()์ ์ด์ฉํ๊ธฐ ์ํด
- ์คํ์ ์ต์์ ์ฅ์๋ฅผ ์ถ๋ฐ์ง๋ก ํ๋ ํญ๊ณต๊ถ์ด ์๋์ง ํ์
- ์์ผ๋ฉด ์คํ์ ๋์ฐฉ์ง๋ฅผ ์ถ๊ฐ
- ์์ผ๋ฉด ํด๋น ๋์ฐฉ์ง๋ฅผ ๊ฒฝ๋ก์ ์ถ๊ฐ
from collections import defaultdict
def solution(tickets):
routes = {}
for t in tickets:
routes[t[0]]=routes.get(t[0], [])+[t[1] ]
# ๋ชฉ์ ์ง ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ(์๊ฐ๋ณต์ก๋ O(1)์ธ pop ์ฐ์ฐ ์ฌ์ฉ)
for key in routes.keys():
routes[key].sort(reverse = True)
print(routes)
stack = ["ICN"]
path = []
path_idx=[]
while len(stack)>0:
top=stack[-1]
if top not in routes or len(routes[top])==0:
path.append(stack.pop())
else:
stack.append(routes[top].pop())
return path[::-1]