๐Ÿงฉ Algorithm/[BOJ] Silver

BOJ 10816๋ฒˆ : ์ˆซ์ž ์นด๋“œ2 (Python/Silver 4)

devCloud 2023. 3. 20. 22:34
728x90
 

10816๋ฒˆ: ์ˆซ์ž ์นด๋“œ 2

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,

www.acmicpc.net

๋ฌธ์ œ

์ˆซ์ž ์นด๋“œ๋Š” ์ •์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์ ํ˜€์ ธ ์žˆ๋Š” ์นด๋“œ์ด๋‹ค. ์ƒ๊ทผ์ด๋Š” ์ˆซ์ž ์นด๋“œ N๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ •์ˆ˜ M๊ฐœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ด ์ˆ˜๊ฐ€ ์ ํ˜€์žˆ๋Š” ์ˆซ์ž ์นด๋“œ๋ฅผ ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ƒ๊ทผ์ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ˆซ์ž ์นด๋“œ์— ์ ํ˜€์žˆ๋Š” ์ˆ˜๋Š” -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

์…‹์งธ ์ค„์—๋Š” M(1 ≤ M ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋„ท์งธ ์ค„์—๋Š” ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ˆซ์ž ์นด๋“œ์ธ์ง€ ๊ตฌํ•ด์•ผ ํ•  M๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ˆ˜๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด์ ธ ์žˆ๋‹ค. ์ด ์ˆ˜๋„ -10,000,000๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ M๊ฐœ์˜ ์ˆ˜์— ๋Œ€ํ•ด์„œ, ๊ฐ ์ˆ˜๊ฐ€ ์ ํžŒ ์ˆซ์ž ์นด๋“œ๋ฅผ ์ƒ๊ทผ์ด๊ฐ€ ๋ช‡ ๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„ํ•ด ์ถœ๋ ฅํ•œ๋‹ค.


์˜ˆ์ œ ์ž…๋ ฅ

10
6 3 2 10 10 10 -10 -10 7 3
8
10 9 -5 2 3 4 5 -10

์˜ˆ์ œ ์ถœ๋ ฅ

3 0 0 1 2 0 0 2

ํ’€์ด

- ์ด๋ถ„ํƒ์ƒ‰ ์ด์šฉ

Solution

์‹œ๊ฐ„์ดˆ๊ณผ ํ’€์ด

M = int(input())
MCard = list(map(int, input().split()))
N = int(input())
NCard = list(map(int, input().split()))

MCard.sort() #sort O(nlogn)
r = []
def Binary_Search(x):
    start = 0
    end = M - 1
    num = 0
    while start <= end:
        mid = (start + end) // 2
        if MCard[mid] == x:
            #num += 1
            #MCard.remove(x)
            return MCard.count(x) #count O(n^2)

        if MCard[mid] < x:
            start = mid + 1
        else:
            end = mid - 1
    return 0

for i in NCard:
    r.append(Binary_Search(i))
print(r)

 

์˜ณ์€ ํ’€์ด 1 (Counter ์ด์šฉ)

from sys import stdin
from collections import Counter #collections - ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐํ˜•

M = stdin.readline()
MCard = sorted(map(int, stdin.readline().split()))
N = stdin.readline()
NCard = map(int, stdin.readline().split())

C = Counter(MCard) #Counter({10: 3, -10: 2, 3: 2, 2: 1, 6: 1, 7: 1})
print(' '.join(f'{C[m]}' if m in C else '0' for m in NCard))

์˜ณ์€ ํ’€์ด 2 (Dict ์ด์šฉ)

from sys import stdin
N = stdin.readline()
NCard = sorted(map(int, stdin.readline().split()))
M = stdin.readline()
MCard = map(int, stdin.readline().split())

def Binary_Search(x, NCard, start, end):
    if start > end:
        return 0
    mid = (start + end) // 2
    if NCard[mid] == x:
        return cnt.get(x) #dict.get(key, default = None)
    elif NCard[mid] > x:
        return Binary_Search(x, NCard, start, mid - 1)
    else:
        return Binary_Search(x, NCard, mid + 1, end)

cnt = { } #dictionary
for i in NCard:
    if i in cnt:
        cnt[i] += 1
    else:
        cnt[i] = 1

for i in MCard:
    print(Binary_Search(i, NCard, 0, len(NCard)-1), end = ' ')
728x90