λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”‘ μ•Œκ³ λ¦¬μ¦˜/λ°±μ€€ Python

[λ°±μ€€] μ •λ ¬ /파이썬 - 10814 10815 1026

by Tamii 2021. 4. 19.
λ°˜μ‘ν˜•

πŸ“Œ 10814 λ‚˜μ΄μˆœ μ •λ ¬

 

10814번: λ‚˜μ΄μˆœ μ •λ ¬

온라인 저지에 κ°€μž…ν•œ μ‚¬λžŒλ“€μ˜ λ‚˜μ΄μ™€ 이름이 κ°€μž…ν•œ μˆœμ„œλŒ€λ‘œ 주어진닀. μ΄λ•Œ, νšŒμ›λ“€μ„ λ‚˜μ΄κ°€ μ¦κ°€ν•˜λŠ” 순으둜, λ‚˜μ΄κ°€ κ°™μœΌλ©΄ λ¨Όμ € κ°€μž…ν•œ μ‚¬λžŒμ΄ μ•žμ— μ˜€λŠ” μˆœμ„œλ‘œ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„

www.acmicpc.net

λ‘λ²ˆμ§Έ 기쀀이 κ°€μž…ν•œ μˆœμ„œμΈλ° μ›λž˜ κ°€μž…ν•œ μˆœμ„œλ‘œ μ •λ ¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— ν•œ 개의 쑰건으둜만 μ •λ ¬ν–ˆλ‹€.

 

내풀이

import sys
input = sys.stdin.readline

n  = int(input())
members = [list(map(str,input().split())) for _ in range(n)]
members.sort(key=lambda x: (int(x[0])))
for i in members:
    print(*i)

근데 μƒκ°ν•΄λ³΄λ‹ˆ map으둜 받을 ν•„μš”κ°€ μ—†μ—ˆλ‹€.

members = [list(input().split()) for _ in range(n)]

κ·Έλž˜μ„œ μ΄λ ‡κ²Œ ν•΄λ‹Ή λΆ€λΆ„μ˜ map을 지웠닀.  

 

λ‹€λ₯Έ 풀이

for i in range(n):
    a,b = input().split()
    lists.append([int(a),b])

λ‹€λ₯Έ 풀이λ₯Ό λ³΄λ‹ˆ μ΄λ ‡κ²Œ λ³€μˆ˜λ‘œ λ°›μ•„μ„œ μ •λ ¬λ‘œ λ„£λŠ”λ° 더 λΉ¨λžλ‹€.

λ³΄λ‹ˆκΉŒ for문을 돌며 ν•˜λŠ”  ν–‰μœ„

λ‚˜: 넣어쀄 λ•Œλ§ˆλ‹€ list둜 λ°”κΎΈκ³ ,

λ‹€λ₯Έ 풀이: λ‹¨μˆœ 인자λ₯Ό λ¬Άμ–΄μ„œ append ν•˜κΈ° λ•Œλ¬Έμ—

λ©”λͺ¨λ¦¬ 차지와 μ†λ„μ—μ„œ 차이가 λ‚˜λŠ”κ²ƒμœΌλ‘œ νŒλ‹¨ν–ˆλ‹€.

 

πŸ’™ μž‘μ€ μ—°μŠ΅λ¬Έμ œμ—μ„œλŠ” 상관 μ—†κ² μ§€λ§Œ, 큰 μ„œλΉ„μŠ€, 데이터λ₯Ό 관리할 λ•Œμ—λŠ” 속도도 신경써야 ν•  것이기 λ•Œλ¬Έμ— 미리미리 μ—°μŠ΅μ„ ν•΄λ³΄μž

 


πŸ“Œ 1026 보물

www.acmicpc.net/problem/1026

 

1026번: 보물

첫째 쀄에 N이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” A에 μžˆλŠ” N개의 μˆ˜κ°€ μˆœμ„œλŒ€λ‘œ 주어지고, μ…‹μ§Έ μ€„μ—λŠ” B에 μžˆλŠ” μˆ˜κ°€ μˆœμ„œλŒ€λ‘œ 주어진닀. N은 50보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄κ³ , A와 B의 각 μ›μ†ŒλŠ” 100보닀 μž‘κ±°

www.acmicpc.net

μ΅œμ†Œκ°’μ„ λ§Œλ“€μ–΄μ•Ό 함

κ°€μž₯ ν°μˆ˜λŠ” κ°€μž₯ μž‘μ€μˆ˜μ™€ 곱해져야함 

B의 μžλ¦¬λŠ” λ°”κΏ€ 수 μ—†μœΌλ‹ˆ

B의 μˆ˜κ°€ 큰 μˆœμ„œλŒ€λ‘œ κ·Έ μžλ¦¬μ— A의 μž‘μ€ μˆœμ„œμ˜ μˆ˜λ“€μ„ μœ„μΉ˜μ‹œμΌœμ•Όν•¨

 

Aλ₯Ό μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ°°μ—΄ν•œ ν›„

Aλ₯Ό 돌며 B의 μ΅œλŒ€κ°’κ³Ό κ³±ν•΄μ„œ 더해쀀 ν›„ λ°”λ‘œ μ΅œλŒ€κ°’μ„ λΉΌμ€€λ‹€(remove)

 

내풀이

import sys
input = sys.stdin.readline
sum=0

n = int(input())
aArr = list(map(int,input().split()))
bArr = list(map(int,input().split()))
aArr.sort()
for i in aArr:
    bMax = max(bArr)
    sum+=i*max(bArr)
    bArr.remove(bMax)

print(sum)

처음 생각은 A sortν•˜κ³  B reverse sort ν•˜κ³  κ³±ν•΄μ£ΌλŠ” κ±°μ˜€λŠ”λ° B의 정렬을 λ°”κΎΈλ©΄ μ•ˆλœλ‹€κ³  ν•΄μ„œ λ§μ•˜λ‹€.

근데 μ–΄μ°¨ν”Ό 합을 κ΅¬ν•˜λŠ” κ±°λ‹ˆ 정렬을 바꿔도 λ˜λŠ”κ±ΈκΉŒ? μ• λ§€ν•˜λ‹€κ³  μƒκ°ν•œλ‹€ γ…Ž

 

λ‹€λ₯Έν’€μ΄

for i in range(n):
    sum+=A[i]*B[n-i-1]

 

λ‹€λ₯Έ 풀이λ₯Ό λ³΄λ‹ˆ Bλ₯Ό λ‘˜λ‹€ μ˜€λ¦„μ°¨μˆœ 정렬해두고 n을 μ΄μš©ν•΄μ„œλ§Œ κ³±ν•˜λŠ” 방법도 μžˆμ—ˆλ‹€.

 


πŸ“Œ 10815 μˆ«μžμΉ΄λ“œ

www.acmicpc.net/problem/10815

 

10815번: 숫자 μΉ΄λ“œ

첫째 쀄에 상근이가 가지고 μžˆλŠ” 숫자 μΉ΄λ“œμ˜ 개수 N(1 ≤ N ≤ 500,000)이 주어진닀. λ‘˜μ§Έ μ€„μ—λŠ” 숫자 μΉ΄λ“œμ— μ ν˜€μžˆλŠ” μ •μˆ˜κ°€ 주어진닀. 숫자 μΉ΄λ“œμ— μ ν˜€μžˆλŠ” μˆ˜λŠ” -10,000,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10,

www.acmicpc.net

 μˆ«μžμΉ΄λ“œλ§Œ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ ν›„ 

μˆ«μžμΉ΄λ“œ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•  4μ§Έ 쀄을 돌며 μˆ«μžκ°€ μžˆλŠ”μ§€ ν™•μΈν•˜λ‹€.

단점: 맀 μΉ΄λ“œλ§ˆλ‹€ λŒμ•„μ•„ν– 

 

import sys
input = sys.stdin.readline

n=int(input())
cardNum = list(map(int,input().split()))
m=int(input())
checkNum = list(map(int,input().split()))
isCard=[0]*m

for i in range(m):
    if(checkNum[i] in cardNum):
        isCard[i]+=1
print(*isCard)

μ—­μ‹œλ‚˜ μ‹œκ°„μ΄ˆκ³Όλ˜μ—ˆλ‹€.

이유λ₯Ό μ°Ύμ•„λ³΄λ‹ˆ

nκ³Ό m이 1λΆ€ν„° 10만 μ‚¬μ΄λ‘œ 주어지기 λ•Œλ¬Έμ— for문을 일일히 λ„λŠ”κ²ƒμ€ 사싀  λΆˆκ°€λŠ₯ν•˜λ‹€λŠ” 평이닀.

 

κ·ΈλŸ¬λ‹€ 이뢄탐색에 λŒ€ν•΄μ„œ μ•Œκ²Œ λ˜μ—ˆλŠ”λ°


 

βœοΈμ΄λΆ„νƒμƒ‰ = 이진탐색

데이터가 μ •λ ¬λœ λ°°μ—΄μ—μ„œ νŠΉμ •ν•œ 값을 μ°Ύμ•„λ‚΄λŠ”λ°

쀑간값을 κΈ°μ€€μœΌλ‘œ 크기λ₯Ό λΉ„κ΅ν•˜λ©° κ·Έ λ²”μœ„λ₯Ό μ€„μ—¬λ‚˜κ°€λŠ” 방식이닀.

 

μ˜ˆμ‹œλ‘œ

2λ₯Ό μ°ΎκΈ° μœ„ν•΄ μ •λ ¬μ˜ 쀑간값을 μ°Ύμ•„μ„œ 크기λ₯Ό λΉ„κ΅ν•˜κ³ 

κ·Έ 크기보닀 μž‘μœΌλ©΄ 쀑간값 μ΄ν•˜λ‘œ λ²”μœ„λ₯Ό μ’ν˜€μ„œ 

 

λ‹€μ‹œ κ·Έ 쀑간값과 λΉ„κ΅ν•˜λŠ” 방식

 

 

 

 

 


λ‹€λ₯Έ 풀이1

def bin_search (ele,sort_list,start=0,end=None):
    if end == None:
        end = len(sort_list) - 1
    if start > end:
        return 0
    mid=(start+end)//2

    if ele == sort_list[mid]:
        return 1
    elif ele < sort_list[mid]:
        end=mid-1
    elif ele > sort_list[mid]:
        start = mid+1
    return bin_search(ele,sort_list,start,end)

n=int(input())
card_list = list(map(int,input().split()))
m=int(input())
check_list = list(map(int,input().split()))

card_list.sort()
ans=[]
for i in check_list:
    ans.append(bin_search(i, card_list))

print(" ".join(map(str,ans)))

λΈ”λ‘œκ·Έμ˜ ν›„κΈ°λ₯Ό 보고 μ°Έκ³ ν•˜μ—¬ bin_search λΌλŠ” μ˜€λ¦„μ°¨μˆœ 리슀트λ₯Ό 탐색할 수 μž‡λŠ” function을 λ§Œλ“€μ–΄ νƒμƒ‰ν–ˆλ‹€.

 

근데 ν›„κΈ°λ₯Ό 쒀더 λ³΄λ‹ˆ dictionary λ₯Ό μ΄μš©ν•΄ ν‘ΈλŠ” 방법이 μžˆμ—ˆλ‹€.

 

λ‹€λ₯Έν’€μ΄2

n=int(input())
card_list = list(map(int,input().split()))
m=int(input())
check_list = list(map(int,input().split()))

check_dict = { i:0 for i in check_list}

for i in card_list:
    if(i in check_dict.keys()):
        check_dict[i]=1

print(" ".join(list(map(str,check_dict.values()))))

μ΄λ ‡κ²Œ check_list의 값이 key이고 0을value  둜 가진 κ°’μœΌλ‘œ λ§Œλ“€κ³ 

card listλ₯Ό 돌며 값이 key에 μ‘΄μž¬ν•˜λ©΄ value+1 ν•˜λŠ” 방식

 

 

 

 

 

πŸ’™ 금방 λ‚œμ΄λ„κ°€ 높아진걸 λŠκΌˆλ‹€. λ‹¨μˆœν•œ λ¬Έμ œμ˜€μ§€λ§Œ μ°Ύμ•„λ³΄λ‹ˆ λ‹€μ–‘ν•œ 풀이듀이 μžˆμ—ˆκ³  κ·Έκ±Έ μ •λ¦¬ν•˜λŠ”λ° ν•œμ°Έ κ±Έλ Έλ‹€. 이제 μ•Œκ³ λ¦¬μ¦˜ μ‹œμž‘μΈκ°€λ³΄λ‹€.

λŒ“κΈ€