BOJ/๐Ÿฅˆ

โ˜…Bitmasking Intermediate I - 3 Solvedโ˜…

metamong 2023. 1. 5.

๐Ÿ”Ÿ bitmasking ์—ฐ์‚ฐ์€ ๋งค์šฐ ๋น ๋ฅธ ์—ฐ์‚ฐ์œผ๋กœ O(1)์˜ time complexity๋ฅผ ๋ณด์ด๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ๋งŽ์ด ์“ฐ์ด๋Š” ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜

 

๐Ÿ”Ÿ ๋‹ค๋งŒ, 0๊ณผ 1์„ ์ด์šฉํ•œ 2์ง„์ˆ˜ ์—ฐ์‚ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ปดํ“จํ„ฐ๊ฐ€ ์‹ค์ œ๋กœ ์—ฐ์‚ฐํ•˜๋Š” ํ•˜๋“œ์›จ์–ด์ ์ธ ์„ฑ๊ฒฉ์ด ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ๋‹จ์ˆœ ์—ฐ์‚ฐ๋ณด๋‹ค ์ข€ ๋” ์‹ ๊ฒฝ์„ ์จ์•ผ ํ•จ

 

๐Ÿ”Ÿ ์•„๋ž˜ ๊ฐœ๋… ์ •๋ฆฌ ๋งํฌ ์ฐธ์กฐ

 

โ˜€๏ธbitmaskingโ˜€๏ธ

* intro> ๐Ÿ’ง bitmask = '์ปดํ“จํ„ฐ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋ชจ๋“  ์ž๋ฃŒ๋ฅผ ์ด์ง„์ˆ˜๋กœ ํ‘œํ˜„. ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ด ์ •์ˆ˜์˜ ์ด์ง„์ˆ˜ ํ‘œํ˜„์„ ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ์“ฐ๋Š” ๊ธฐ๋ฒ•' (์—„๋ฐ€ํ•˜๊ฒŒ ์ž๋ฃŒ๊ตฌ์กฐ๋Š” ์•„๋‹˜) ๐Ÿ’ง 2์ง„์ˆ˜ ๊ด€๋ จ bit ์—ฐ์‚ฐ์„ ์ง„ํ–‰

sh-avid-learner.tistory.com

 

๐Ÿ”Ÿ ํŠนํžˆ ์ง‘ํ•ฉ ๊ด€๋ จ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•  ๋•Œ bitmasking ๊ธฐ๋ฒ•์ด ๋งŽ์ด ์“ฐ์ธ๋‹ค. ์—ฌ๋Ÿฌ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ ์ ์‘ํ•˜๋„๋ก ํ•˜์ž

 

๐Ÿ”Ÿ ๋น„ํŠธ ์—ฐ์‚ฐ์ž ์•„๋ž˜ 6๊ฐœ๋Š” ํ•„์ˆ˜์ ์œผ๋กœ remind


โ˜… 11723 ์ง‘ํ•ฉ โ˜…

 

๐Ÿ”Ÿ ํŒŒ์ด์ฌ ์ง‘ํ•ฉ set() ๊ด€๋ จ ํ•จ์ˆ˜(add(), discard(), remove(), clear())๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ’€์ด๋„ ์กด์žฌ

 

โ€ป set() ๊ด€๋ จ ๋ฉ”์†Œ๋“œ add(), discard(), remove(), clear(), pop() ๋ชจ๋‘ time-complexity O(1)์„ ๋ณด์—ฌ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. โ€ป

 

import sys
input=sys.stdin.readline
S=set()
for _ in range(int(input())):
    op=input().rstrip()
    o=op.split()[0]
    if o not in ['all','empty']:
        n = int(op.split()[1])      
        if o=='add':S.add(n)
        elif o=='remove':S.discard(n)
        elif o=='check':print(1 if n in S else 0)
        else:S.remove(n)if n in S else S.add(n)
    elif o=='all':S={i for i in range(1,21)}
    else:S.clear()

 

๐Ÿ”Ÿ ์ด์ œ set()๊ฐ€ ์•„๋‹Œ, bitmasking์œผ๋กœ code๋ฅผ ํ‘œํ˜„ํ•ด๋ณด๋„๋ก ํ•˜๋ฉด,

 

โ‘  1๋ถ€ํ„ฐ 20๊นŒ์ง€์˜ ์ˆ˜๊ฐ€ ๊ฐ๊ฐ ์ง‘ํ•ฉ์— ์กด์žฌํ•œ๋‹ค๋ฉด, ์ด์ง„์ˆ˜์˜ ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜๊ฐ€ 1, ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜๋ฅผ 0์œผ๋กœ ํ‘œํ˜„

(ex) 1๊ณผ 3์ด ์ง‘ํ•ฉ์— ์กด์žฌํ•œ๋‹ค๋ฉด S๋ผ๋Š” ์ˆ˜๋ฅผ 1010๋กœ ํ‘œํ˜„)

 

โ€ป 1<<num ์—ฐ์‚ฐ์—์„œ, 1์ด ์กด์žฌํ•œ๋‹ค๋ฉด 1<<1 ๊ฒฐ๊ณผ๋กœ 10์œผ๋กœ ํ‘œํ˜„๋˜๋ฏ€๋กœ

์ด์ง„์ˆ˜ ์ƒ์—์„œ ๋งจ ๋งˆ์ง€๋ง‰ ์ž๋ฆฌ๋Š” 0์˜ ์ž๋ฆฌ์ˆ˜, 1์€ ์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€ ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜,

2๋Š” ์˜ค๋ฅธ์ชฝ ๊ธฐ์ค€ ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜๋กœ ์„ค์ • โ€ป

(<<์—ฐ์‚ฐ์ž์˜ ํŽธ์˜์„ฑ์„ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์ „์ œ๋ฅผ ๋งŒ๋“  ๋’ค ์ง„ํ–‰ํ•จ์„ ์žŠ์ง€ ๋ง์ž!)

 

โ‘ก 1๋ถ€ํ„ฐ 20์‚ฌ์ด์˜ ์ˆ˜ x๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” add ์—ฐ์‚ฐ

→ 1010์—์„œ 2๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ๋‘๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜๊ฐ€ 1๋กœ ๋ณ€ํ•˜๋ฉด์„œ 1110๋กœ ๋˜์–ด์•ผ ํ•œ๋‹ค.

→ idea) ๊ธฐ์กด 1010์—์„œ 1์„ << ์—ฐ์‚ฐ์ž๋กœ ์ˆ˜ x์— ๋งž๊ฒŒ ์˜ฎ๊ธด ๋’ค(0100), 1010๊ณผ 0100์„ or | ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ 111๋กœ ๋ฐ”๊พผ๋‹ค.

S=S|(1<<num)

 

โ‘ข 1๋ถ€ํ„ฐ 20์‚ฌ์ด์˜ ์ˆ˜ x๋ฅผ ์ œ๊ฑฐํ•˜๋Š” remove ์—ฐ์‚ฐ

→ 1010์—์„œ 3์„ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜๊ฐ€ 0์œผ๋กœ ๋ณ€ํ•˜๋ฉด์„œ 0010๋กœ ๋˜์–ด์•ผ ํ•œ๋‹ค

→ idea) ๊ธฐ์กด 1010์—์„œ 1์„ << ์—ฐ์‚ฐ์ž๋กœ ์ˆ˜ x์— ๋งž๊ฒŒ ์˜ฎ๊ธด ๋’ค(1000), ~ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด 1๊ณผ 0์„ ์„œ๋กœ ๋ฐ”๊พผ ๋‹ค์Œ(0110), 1010๊ณผ 0110์„ and & ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋กœ 0010๋กœ ๋ฐ”๊พผ๋‹ค.

S=S&~(1<<num)

 

โ‘ฃ 1๋ถ€ํ„ฐ 20์‚ฌ์ด์˜ ์ˆ˜ x๊ฐ€ ์žˆ๋Š” ์ง€ ํ™•์ธํ•˜๋Š” check ์—ฐ์‚ฐ

→ idea) 1010์—์„œ 3์ด ์กด์žฌํ•˜๋Š” ์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ธฐ์กด 1010์—์„œ 1์„ << ์—ฐ์‚ฐ์ž๋กœ ์ˆ˜ x์— ๋งž๊ฒŒ ์˜ฎ๊ธด ๋’ค(1000), 1010๊ณผ 1000์„ and & ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด ์ค€๋‹ค. ๋งŒ์•ฝ ์กด์žฌํ•œ๋‹ค๋ฉด & ์—ฐ์‚ฐ์œผ๋กœ 1๊ณผ 1์˜ ๊ฒฐ๊ณผ 1์ด ๋‚˜์˜ค๊ณ , ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด 1๊ณผ 0์˜ ๊ฒฐ๊ณผ 0์ด ๋‚˜์˜จ๋‹ค.

1 if S&(1<<num) else 0

 

โ‘ค 1๋ถ€ํ„ฐ 20์‚ฌ์ด์˜ ์ˆ˜ x๊ฐ€ ์ง‘ํ•ฉ์— ์žˆ์œผ๋ฉด ์‚ญ์ œ, ์—†์œผ๋ฉด ์ถ”๊ฐ€ํ•˜๋Š” toggle ์—ฐ์‚ฐ

→ idea) 1010์—์„œ 3์ด ์กด์žฌํ•œ๋‹ค๋ฉด ์‚ญ์ œ, 3์ด ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ธฐ์กด 1010์—์„œ 1์„ << ์—ฐ์‚ฐ์ž๋กœ ์ˆ˜ x์— ๋งž๊ฒŒ ์˜ฎ๊ธด ๋’ค(1000), 1010๊ณผ 1000์„ xor ^ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด์ค€๋‹ค. ^ ์—ฐ์‚ฐ์€ 1๊ณผ 0 ์„œ๋กœ ๋‹ค๋ฅด๋‹ค๋ฉด 1, 0๊ณผ 0 ๋˜๋Š” 1๊ณผ 1์ด๋ผ๋ฉด 0์„ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์—ฐ์‚ฐ์ด๋‹ค.

→ (1) ๋„ฃ๊ณ  ์‹ถ์€ ์ˆ˜์˜ ์ž๋ฆฌ์ˆ˜์—์„œ(1), ์›๋ž˜ ์ˆ˜์— ๋งŒ์•ฝ ์—†์„ ๊ฒฝ์šฐ(0), xor ์—ฐ์‚ฐ ๊ฒฐ๊ณผ(0๊ณผ 1) 1์ด ๋˜์–ด ์ƒ๊ธฐ๊ณ 

→ (2) ๋„ฃ๊ณ  ์‹ถ์€ ์ˆ˜์˜ ์ž๋ฆฌ์ˆ˜์—์„œ(1), ์›๋ž˜ ์ˆ˜์— ๋งŒ์•ฝ ์žˆ์„ ๊ฒฝ์šฐ(1),  xor ์—ฐ์‚ฐ ๊ฒฐ๊ณผ(1๊ณผ 1) 0์ด ๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค.

S=S^(1<<num)

 

โ‘ฅ ๋ชจ๋“  ์ˆ˜๊ฐ€ ์ง‘ํ•ฉ์— ์กด์žฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” all ์—ฐ์‚ฐ / ๋ชจ๋“  ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” empty ์—ฐ์‚ฐ

→ idea) 1๋ถ€ํ„ฐ 20๊นŒ์ง€ ๋ชจ๋“  ์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์ง„์ˆ˜๋Š” 111111111111111111110์ด๋‹ค. ์ด๋Š” 1์„ 21๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜๋กœ ์˜ฎ๊ธด ๊ฒฐ๊ณผ(1<<21; 1000000000000000000000)์—์„œ 2๋ฅผ ๋นผ๋ฉด ์›ํ•˜๋Š” ์ด์ง„์ˆ˜ 111111111111111111110๊ฐ€ ๋‚˜์˜จ๋‹ค. ((1<<21)-2)

S=(1<<21)-2

 

โ€ป ์ฃผ์˜ โ€ป

<<์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋บ„์…ˆ(-)๋ณด๋‹ค ๋‚ฎ์œผ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๊ด„ํ˜ธ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค!

 

→ idea) ๋ชจ๋“  ์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ๋ชจ๋“  ์ž๋ฆฌ์ˆ˜๊ฐ€ 0์ด๋ฏ€๋กœ S=0

S=0

 

๐Ÿ”Ÿ ์œ„ add, remove, check, toggle, all, empty ์—ฐ์‚ฐ์— ๋งž๊ฒŒ bitmasking์œผ๋กœ code๋ฅผ ์งœ๋ณด๋ฉด ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

import sys
input=sys.stdin.readline

S=0

for _ in range(int(input())):
    op=input().rstrip()
    o=op.split()[0]
    if o not in ['all','empty']:
        num = int(op.split()[1])
        
        if o=='add': #S์— x์ถ”๊ฐ€
            S=S|(1<<num)
        elif o=='remove':#S์— x์ œ๊ฑฐ
            S=S&~(1<<num)
        elif o=='check':#S์— x๊ฐ€ ์žˆ์œผ๋ฉด 1, ์—†์œผ๋ฉด 0 ์ถœ๋ ฅ
            print(1 if S&(1<<num) else 0) #0b0์ด๋ฉด False, 1์ด์ƒ์ด๋ฉด True
        else:#toggle S์— x๊ฐ€ ์žˆ์œผ๋ฉด x์ œ๊ฑฐ, ์—†์œผ๋ฉด x ์ถ”๊ฐ€
            S=S^(1<<num)
    elif o=='all':S=(1<<21)-2
    else:#empty
        S=0

โ˜… 14569 ์‹œ๊ฐ„ํ‘œ ์งœ๊ธฐ โ˜…

 

import sys
input=sys.stdin.readline
l=[]
for _ in range(int(input())):
    yonsei_class=list(map(int,input().split()))
    class_code=0
    for i in range(1,yonsei_class[0]+1):
        class_code=class_code|(1<<yonsei_class[i])
    l.append(class_code)
for student in range(int(input())):
    student_empty=list(map(int,input().split()))
    student_empty_code=0
    subject=0
    for i in range(1,student_empty[0]+1):
        student_empty_code=student_empty_code|(1<<student_empty[i])
    for code in l:
        if code == (code&student_empty_code): subject+=1
    print(subject)

 

๐Ÿ”Ÿ bitmasking ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด code ์‹คํ–‰ ์‹œ๊ฐ„์„ ํ™•์‹คํžˆ ๋‹จ์ถ• ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค(ํƒ€ ํ’€์ด ์‹คํ–‰ ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ์ ๊ฒŒ ๋‚˜์™”์Œ)

 

๐Ÿ”Ÿ 

โ‘  ๋จผ์ € ๊ฐ ๊ณผ๋ชฉ๋ณ„๋กœ class_code๋ฅผ ๋งŒ๋“ ๋‹ค

(ex) ํ•ด๋‹น ๊ณผ๋ชฉ์ด 2,3๊ต์‹œ์— ์ˆ˜์—…ํ•œ๋‹ค๋ฉด class_code๋Š” 2์ง„์ˆ˜๋กœ 1100์œผ๋กœ ํ‘œํ˜„)

→ ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ณผ๋ชฉ์˜ class_code๋ฅผ l list์— ๋„ฃ์Œ

class_code=class_code|(1<<yonsei_class[i])

 

โ€ป << ์—ฐ์‚ฐ์ž์™€ ๊ธฐ์กด class_code์™€์˜ | ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด class_code๋ฅผ ์™„์„ฑ โ€ป

 

โ‘ก ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ด์ œ ๊ฐ ํ•™์ƒ๋ณ„ student_empty_code๋ฅผ ๋งŒ๋“ ๋‹ค

(ex) ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ ํ•™์ƒ์€ 2,3๊ต์‹œ์— ์‰ฐ๋‹ค๋ฉด student_empty_code๋Š” 2์ง„์ˆ˜๋กœ 1100์œผ๋กœ ํ‘œํ˜„)

student_empty_code=student_empty_code|(1<<student_empty[i])

 

โ‘ข ์ด์ œ class_code์™€ student_empty_code์™€ ๋น„๊ต

(ex) class_code๊ฐ€ 1100์ด๊ณ , student_empty_code๊ฐ€ 11100์ด๋ผ๋ฉด, & ์—ฐ์‚ฐ์ž ๊ฒฐ๊ณผ 1100 ์ฆ‰ class_code๊ฐ€ ๋œ๋‹ค. ์ด ๋œป์€ ๊ธฐ์กด class_code์—์„œ 1์ด ์žˆ๋Š” ์ž๋ฆฌ์— ํ•™์ƒ์ด ์‰ฐ๋‹ค๋ฉด, ์ฆ‰ 1์ด ์žˆ๋‹ค๋ฉด 1 & 1 ๊ฒฐ๊ณผ๋กœ ๊ณ„์† 1์ด ๋˜์–ด ๋‚จ๊ฒŒ ๋จ. ๋”ฐ๋ผ์„œ class_code๋กœ ๊ทธ๋Œ€๋กœ ๋‚จ๋Š” ๋‹ค๋ฉด, ํ•ด๋‹น ํ•™์ƒ์€ ์ด class๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป!)

if code == (code&student_empty_code): subject+=1

โ˜… 1094 ๋ง‰๋Œ€๊ธฐ โ˜…

print(bin(int(input()))[2:].count('1'))

 

๐Ÿ”Ÿ ์ฃผ์–ด์ง„ ์ˆซ์ž๊ฐ€ 2์˜ ์ œ๊ณฑ์ˆ˜์— ํ•ด๋‹น๋˜๋Š”, ๋ช‡ ๊ฐœ์˜ ๋‚˜๋ฌด ์ข…๋ฅ˜๋กœ X๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ง€ ์•Œ์•„๋ณด๋Š” ๋ฌธ์ œ. ์˜ˆ๋ฅผ ๋“ค์–ด 23์€ ์ด์ง„์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ 10111์ด๋ฏ€๋กœ ์ด 4๊ฐœ์˜ ๋‚˜๋ฌด ์ข…๋ฅ˜์˜ ํ•ฉ์œผ๋กœ 23์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ 2์ง„์ˆ˜๋กœ ๋‚˜ํƒ€๋ƒˆ์„ ๋•Œ 1์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ •๋‹ต. 2์˜ ์ œ๊ณฑ์ˆ˜์˜ ํ•ฉ ํ‘œํ˜„์€ ๋น„ํŠธ๋งˆ์Šคํฌ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ง๊ด€ ๊ธฐ์–ต


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

๋Œ“๊ธ€