NumberMagicEasy

Cute_Security15·2025년 11월 19일

알고리즘

목록 보기
13/27

문제

숫자 4개가 적혀있는 카드가 있다

card 1 : 1 2 3 4 5 6 7 8
card 2 : 1 2 3 4 9 10 11 12
card 3 : 1 2 5 6 9 10 13 14
card 4 : 1 3 5 7 9 11 13 15

하나코는 카드를 보고 숫자 하나를 떠올린다

이후 각 카드별로 떠올린 숫자가 있는지 Y/N 로 알려준다

길이가 4인 문자열이 입력되면, 하나코가 머릿속에 떠올린 숫자를
interger 로 리턴한다

예시 입력

"YNYY"
"YNNN"
"NNNN"
"YYYY"
"NYNY"

예시 출력

5
8
16
1
11

생각의 변화

card mask 를 만들어 둔다

res = 0 을 두고, card 를 늘려가며 card mask 를 더해간다

  • Y : res |= (mask[card])
  • N : res &= ~(mask[card])

단순 비트연산으로는 부적절

N을 제외한 나머지 Y에서 모두 존재해야 한다

마지막 예제 NYNY 에서 11 대신 3이 나왔다

아.. 시작할때 N을 하면 &= ~() 할때 의미가 없구나

마지막에 N 을 수행하게 해야

한번 더

pseudo code

theNumber(answer)
    res = 0
    card = 0

    mask[] = {
        0x1fe, 0x1e1e, 0x6666, 0xaaaa
    }

    for (it = answer.begin()  it != answer.end()  it++)
        if (*it == 'Y')
            if (res == 0)
                res |= mask[card]
            else
                res &= mask[card]
        
        card++
    
    card = 0
    
    for (it = answer.begin()  it != answer.end()  it++)
        if (*it == 'N')
            res &= ~(mask[card])
        
        card++
        
    for (i = 0  i < 16  i++)
        if (res & 0x01)
            return i
            
        res = res >> 1
    
    return i
profile
관심분야 : Filesystem, Data structure, user/kernel IPC

0개의 댓글