BOJ/๐Ÿฅˆ

โ˜…Sorting Upper-Intermediate I - 6 Solvedโ˜…

metamong 2022. 12. 20.

โ˜… 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)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€