โ 1138 ํ ์ค๋ก ์๊ธฐ โ
N = int(input())
highers = list(map(int,input().split()))[::-1]
orders = []
for higher in highers:
orders.insert(higher,N)
N -= 1
print(*orders)
๐ซ๐ฟ ์์ ๋ณด๋ค ํค ํฐ ์ฌ๋์ด ์์ ๋ช ๋ช ์๋ ์ง ์ ๋ณด์ ๋ฐ๋ผ ์ค์ ์ ์์๋๋ก ์ถ๋ ฅํ๋ ๋ฌธ์
→ ๋จผ์ ํค๊ฐ ํฐ ์ฌ๋๋ถํฐ ์์ ์์ ๋ณด๋ค ํค ํฐ ์ฌ๋์ ์ ๋ณด์ ๋ฐ๋ผ ์ค์ ์ ๋ค๋ฉด(์ ๋ ฅํ ๋ฐ๋์ ์ ๋ ฌ - ์ฌ๊ธฐ์๋ [::-1] ์ฌ์ฉ), ์ด ์ ๋ณด๋ ๊ณง ์์ ์ ์๋ ์ฌ๋์ ๋ช ์๊ฐ ๋๊ณ , ๊ณง ์ค line์ index๊ฐ ๋์ด python insert() ํจ์๋ฅผ ์ฌ์ฉํด ์ฐจ๋ก๋๋ก ์ค์ ์ค ์ ์๋ค.
โ 2108 ํต๊ณํ โ
๐ญ ์ต๋น๊ฐ์ ์ด๋ป๊ฒ ๊ตฌํ๋ ์ง๊ฐ ๊ด๊ฑด์ธ ๋ฌธ์
โ collections module์ Counter ํจ์ ํ์ฉ
โก dictionary hash-table ํ์ฉํด์ key(์) - value(๋น๋)๋ก ์ด๋ฃจ์ด์ง dictionary ํ์ฉ
โข ๋จ์ list์ indexing ํ์ฉ
๐ญ ์๊ฐ ์ ํ์์ ์ ์ผ ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฑด ์ค์๊ฐ ๊ตฌํ๊ธฐ ๋ถ๋ถ
โ sorted(), ๋๋ sort() ์ฌ์ฉ - time complexity O(NlogN)
โก โ ๋ฌธ์ ํน์์ฑ - ์์ ๋ฒ์๋ฅผ ํ์ฉํ freq table ํ์ฉ โ
"์ ๋ ฅ๋๋ ์ ์์ ์ ๋๊ฐ์ 4,000์ ๋์ง ์๋๋ค"
๐ญ ์๊ฐ ๋จ์ถ ์ต์ ํ์ด ๋ต์
import sys
input = sys.stdin.readline
N=int(input())
freq_table=[0]*8001 #๋น๋์ (-4000 ~ 4000)
increase_num=[] #์ฆ๊ฐ ์์
for _ in range(N):
freq_table[int(input())+4000]+=1
for i in range(8001):
if freq_table[i] > 0:
for _ in range(freq_table[i]):
increase_num.append(i-4000)
print(round(sum(increase_num)/N)) #์ฐ์ ํ๊ท
print(increase_num[N//2]) #์ค์๊ฐ
max_freq = max(freq_table)
if freq_table.count(max_freq) > 1:
freq_table[freq_table.index(max_freq)] = 0
print(freq_table.index(max_freq)-4000) #์ต๋น๊ฐ
print(increase_num[N-1]-increase_num[0]) #๋ฒ์
๐ญ 10989 ๋ฐฑ์ค ๋ฌธ์ ์์ count list๋ฅผ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ฐ ๋จ์ถ ๋ฌธ์ ๋ฅผ ํผ ์ ์๋ค. ์ ๋ ฅ๋๋ ์๊ฐ -4000 ์์ 4000์ด๋ผ๋ ํฌ๊ธฐ์ ํ์ ๋์ด ์์ผ๋ฏ๋ก, ์ด๋ฅผ ํ์ฉํด count list, ์ฆ frequency table list๋ฅผ ๋ง๋ฆ
๐ญ ์ต๋น๊ฐ์์, 2๊ฐ ์ด์ ์๋ค๋ฉด, index() ํจ์๋ฅผ ํ์ฉํด ์ฒซ๋ฒ์งธ max_freq์ ํด๋นํ๋ ์๋ง 0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ , ๊ทธ ๋ค์ ๋๋ฒ์งธ ์๋ฅผ ์ถ๋ ฅํ๊ฒ ์ค์ ํจ
๐ญ ์ ๋ ฌ์์ ์๊ฐ ๋จ์ถ, frequency table list idea ๋ฐ๋์ ๊ธฐ์ตํ์!
๐ญ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋ ๋น๊ต
โถ sort(), sorted() ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํด๋น ํจ์์ ์๊ฐ ๋ณต์ก๋ O(NlogN)
โถ frequency table list๋ฅผ ํ์ฉํ ์ ํ์ด์์๋ ์ด์ค for๋ฌธ์ด๋ best์ธ ๊ฒฝ์ฐ O(8001), worst๋ O(8001*N)
(N์ 50๋ง์ผ๋ก 8์ฒ๋ณด๋ค ํจ์ฌ ํฐ ์๋ก frequency table list ์ฌ์ฉ์ด ์๋์ ์ธ ํจ์จ์ฑ์ ๋ณด์์ ์ ์ ์์)
โ 13376 Rune โ
import sys
input = sys.stdin.readline
def get_rune_power(word):
cnt,yes=0,0
for letter in word:
if letter in 'aeiou':
if yes==0:
cnt+=1
yes=1
else: yes = 0
return cnt
for _ in range(int(input())):
l=list(input().split())
tuples=[(word,get_rune_power(word)) for word in l[1:]]
tuples.sort(key=lambda x: (-x[1],x[0]))
print(*(tupl[0] for tupl in tuples))
๐ญ ๋ชจ์์ด ์ฐ์ํด์ ์๋ ๊ฒฝ์ฐ 1๊ฐ๋ก countํ๊ธฐ ์ํด์๋ flag ๋ณ์๋ฅผ ํ์ฉํ๋ฉด ๋๋ค. (get_rune_power func)
๐ญ tuple์ ๋ชจ์์ ์ ๋ ฌํ๋ ๋ฌธ์ ์ ํ์ผ๋ก, ์๋ <11650 ์ขํ ์ ๋ ฌํ๊ธฐ, 11651 ์ขํ ์ ๋ ฌํ๊ธฐ2> ๋ฌธ์ ์์ ๊ด๋ จ ์ ํ์ ์ดํด๋ณด์๋ค.
๐ญ ๋ฐ๋ผ์, tuple์ ๋ชจ์์ ์ ๋ ฌํ๋, tuple์ ๋ ๋ฒ์งธ ์์๋ฅผ ๋ด๋ฆผ์ฐจ์(์ซ์)์ผ๋ก ์ ๋ ฌํ๋ ค๋ฉด lambda x: (-x[1],x[0])
(์ฌ๊ธฐ์ ๋ ๋ฒ์งธ ์์ x[0]์ ์ฒซ ๋ฒ์งธ๋ก ์ ๋ ฌํ์ ๋์ ๊ธฐ์ค์ด ๋์ผํ ๊ฒฝ์ฐ lexicographical ์ฌ์ ์์๋ก ์ ๋ ฌํ๊ฒ ๋ค๋ ๋ป) → ์ฒซ๋ฒ์งธ ์์์ - ์์๋ฅผ ๋ถ์ด๋ ๊ฑธ ์์ง ๋ง์!
โ 28116 ์ ํ ์ ๋ ฌ์ ์ด๋ ๊ฑฐ๋ฆฌ โ
import sys
input=sys.stdin.readline
N=int(input())
arr=list(map(int,input().split()))
dist=[0]*(N+1)
idx=dict()
for x in range(N):
idx[arr[x]] = x
for i in range(0,len(arr)-1):
if arr[i] != (i+1):
min_index = idx[i+1]
idx[arr[i]],idx[i+1] = min_index,i
arr[min_index],arr[i] = arr[i],arr[min_index]
dist[arr[min_index]]+=abs(i-min_index)
dist[arr[i]]+=abs(i-min_index)
print(*dist[1:])
๐ญ ์ ํ ์ ๋ ฌ๋๋ก ์ ๋ ฌํ๋, ์ฃผ์ด์ง array๊ฐ 1๋ถํฐ N๊น์ง ๊ฐ ์์ฐ์๊ฐ 1๊ฐ์ฉ๋ง ๋ฑ์ฅํ๋ ๋ฐฐ์ด. ๊ฐ ์์ฐ์์ idx๋ฅผ ์ ์ฅํ๋ dictionary๋ฅผ ๋ฐ๋ก ๋ง๋ ๋ค, arr[i]๊ฐ i+1์ด ์๋๋ผ๋ฉด min_index์ arr[i] ๋ฃ๊ณ arr[min_index]์ arr[i] swap. ์ด ๋ index๊ฐ์ ๊ฑฐ๋ฆฌ๋ฅผ '์ ํ ์ ๋ ฌ์ ์ด๋๊ฑฐ๋ฆฌ'๋ก ์ค์ . idx dictionary๋ swap
โ 24060 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋ณํฉ ์ ๋ ฌ 1 โ
import sys
input=sys.stdin.readline
def merge(A,p,q,r): #merge A[p,...,q] & A[q+1,....,r] and sort A[p,...r]
#A[p,...q] & A[q+1,...r] each sorted already
global K
i,j,t=p,q+1,0
tmp=[]
while (i<=q and j<=r):
if A[i]<=A[j]:
tmp.append(A[i])
t+=1 #move saving pointer
i+=1 #move pointer
else:
tmp.append(A[j])
t+=1
j+=1
while (i<=q): #if left-side array has some remaining elements...
tmp.append(A[i])
i+=1
while (j<=r): #if right-side array has some remaining elements...
tmp.append(A[j])
j+=1
i,t=p,0
while (i<=r):
A[i] = tmp[t]
K-=1
if K == 0:
print(A[i])
sys.exit()
i+=1
t+=1
def merge_sort(A,p,r): #sort in ascending order (index p ~ r in array A)
global K
if p<r: #check if the subarray's length is bigger than 1
q = (p+r)//2
merge_sort(A,p,q) #sorting left-side array
merge_sort(A,q+1,r) #sorting right-side array
merge(A,p,q,r) # merge
N,K=map(int,input().split())
arr = list(map(int,input().split()))
merge_sort(arr,0,len(arr)-1)
print(-1)
๐ญ ๋ณํฉ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๊ทธ๋๋ก ์ฌ์ฉ. ์ ์ญ๋ณ์๋ก K ์ค์ . ์ ๋ฐ์ดํธ ๋๋(tmp๋ฅผ A๋ก) ์ฝ๋์์ K ๋ง๋ ์ง ํ๋จ
โ 24061 ์๊ณ ๋ฆฌ์ฆ ์์ - ๋ณํฉ ์ ๋ ฌ 2 โ
import sys
input=sys.stdin.readline
def merge(A,p,q,r): #merge A[p,...,q] & A[q+1,....,r] and sort A[p,...r]
#A[p,...q] & A[q+1,...r] each sorted already
global K
i,j,t=p,q+1,0
tmp=[]
while (i<=q and j<=r):
if A[i]<=A[j]:
tmp.append(A[i])
t+=1 #move saving pointer
i+=1 #move pointer
else:
tmp.append(A[j])
t+=1
j+=1
while (i<=q): #if left-side array has some remaining elements...
tmp.append(A[i])
i+=1
while (j<=r): #if right-side array has some remaining elements...
tmp.append(A[j])
j+=1
i,t=p,0
while (i<=r):
A[i] = tmp[t]
K-=1
if K == 0:
print(*A)
sys.exit()
i+=1
t+=1
def merge_sort(A,p,r): #sort in ascending order (index p ~ r in array A)
global K
if p<r: #check if the subarray's length is bigger than 1
q = (p+r)//2
merge_sort(A,p,q) #sorting left-side array
merge_sort(A,q+1,r) #sorting right-side array
merge(A,p,q,r) # merge
N,K=map(int,input().split())
arr = list(map(int,input().split()))
merge_sort(arr,0,len(arr)-1)
print(-1)
'BOJ > ๐ฅ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
โ DP Upper-Intermediate I - 15 Solvedโ (0) | 2023.01.03 |
---|---|
โ DP Intermediate I - 20 Solvedโ (0) | 2022.12.22 |
โ Number Theory Intermediate I - 17 Solvedโ (0) | 2022.12.13 |
โ Stack & Queue & Deque Intermediate I - 20 Solvedโ (0) | 2022.12.11 |
โ Recursion Intermediate - 2 Solvedโ (0) | 2022.12.11 |
๋๊ธ