본문 바로가기
카테고리 없음

다중조건의 비트화

by redcubes 2024. 6. 6.

FizzBuzz 

0.5 초 1024 MB 1458 945 858 66.875%

문제

FizzBuzz 문제는 𝑖=1,2,⋯$i = 1, 2, \cdots$ 에 대해 다음 규칙에 따라 문자열을 한 줄에 하나씩 출력하는 문제입니다.

  • $i$가 $3$의 배수이면서 $5$의 배수이면 “FizzBuzz”를 출력합니다.
  • $i$가 $3$의 배수이지만 $5$의 배수가 아니면 “Fizz”를 출력합니다.
  • $i$가 $3$의 배수가 아니지만 $5$의 배수이면 “Buzz”를 출력합니다.
  • $i$가 $3$의 배수도 아니고 $5$의 배수도 아닌 경우 $i$를 그대로 출력합니다.

FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열이 주어집니다. 이때, 이 세 문자열 다음에 올 문자열은 무엇일까요?

입력

FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열이 한 줄에 하나씩 주어집니다. 각 문자열의 길이는 $8$ 이하입니다. 입력이 항상 FizzBuzz 문제에서 연속으로 출력된 세 개의 문자열에 대응됨이 보장됩니다.

출력

연속으로 출력된 세 개의 문자열 다음에 올 문자열을 출력하세요. 여러 문자열이 올 수 있는 경우, 아무거나 하나 출력하세요.

예제 입력 1 복사

Fizz
Buzz
11

예제 출력 1 복사

Fizz

예제 입력 2 복사

980803
980804
FizzBuzz

예제 출력 2 복사

980806

힌트

FizzBuzz 문제의 𝑖=1,⋯,20$i=1, \cdots, 20$에 대한 출력은 다음과 같습니다.

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz

문제의 특성 상 3개의 숫자 모두 FizzBuzz Fizz Buzz가 올 수는 없다.

숫자가 몇 번째로 발견되었는지 찾아서

(찾은 숫자) + (3 - 발견된 위치의 인덱스) 를 하면 된다.

예를 들어,
Fizz
19
Buzz
라면, 인덱스 1에서 19가 발견되므로 19 + (3 - 1) = 21이 된다.
이 계산을 줄이기 위해서는 인덱스를 그냥 3부터 거꾸로 세어도 된다.

그리고 생성된 수가 부합하는 조건에 따라 [원래 숫자, "Fizz","Buzz","FizzBuzz"]중 하나를 출력해야 하는데,

다양한 조건의 조합에 따라 출력 결과를 내야하는 다중 조건 검사를 해결하기 위해
요즘 자주 쓰고 있는 방법이 있다.

조건1, 조건2, 조건3, 조건4

등의 조건의 조합에 따라 결과를 출력해야 한다면 조건마다 $2^i$의 자릿값을 주고
각각의 조건을 부합할 때 마다 그 값을 더한 뒤 인덱싱으로 결과를 출력하는 것이다.

for i in range(3,0,-1):
    line = input()
    if line.isdecimal():
        res = int(line)+i
        break

d = (res, "Fizz","Buzz","FizzBuzz")
idx = 0
if res % 3 == 0:
    idx+=1
if res % 5 == 0:
    idx+=2
print(d[idx])

예를 들면 이런 문제에서도 비슷하게 쓸 수 있다.

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.
  • 예각 : 0 < angle < 90
  • 직각 : angle = 90
  • 둔각 : 90 < angle < 180
  • 평각 : angle = 180
def solution(angle):
    div = angle//90
    rest = -1 if angle % 90 else 0
    return  (1,3,2,4)[div + rest + 1]

 

"다중조건의 비트화"라는 개념은 여러 조건을 비트로 표현하여 컴퓨터 연산에서 효율적으로 사용하기 위한 방법을 의미합니다. 이를 통해 여러 가지 상태나 조건을 비트로 변환하여 간단하게 비트 연산으로 처리할 수 있습니다. 예를 들어, 플래그 또는 상태 값을 여러 개의 비트로 관리할 때 유용합니다.

아래는 다중조건을 비트로 표현하는 간단한 예제입니다:

  1. 비트마스크 설정:

    • 여러 조건을 각각 하나의 비트로 표현합니다.
    • 예를 들어, 3가지 조건을 다음과 같이 정의할 수 있습니다:
      • 조건 1: 0b001 (1번 비트)
      • 조건 2: 0b010 (2번 비트)
      • 조건 3: 0b100 (3번 비트)
  2. 조건을 비트로 결합:

    • 여러 조건을 동시에 만족하는 상태를 표현할 때는 비트 OR 연산을 사용합니다.
    • 예를 들어, 조건 1과 조건 2를 만족하는 상태는 0b001 | 0b010 = 0b011 (3번 비트)
  3. 조건 검사:

    • 특정 조건이 만족되는지 확인하려면 비트 AND 연산을 사용합니다.
    • 예를 들어, 상태 0b011이 조건 1을 만족하는지 확인하려면 0b011 & 0b001의 결과가 0b001인지 확인합니다.
# 조건 정의
CONDITION_1 = 0b001
CONDITION_2 = 0b010
CONDITION_3 = 0b100

# 조건 결합
state = CONDITION_1 | CONDITION_2  # state = 0b011

# 조건 검사
has_condition_1 = state & CONDITION_1 != 0
has_condition_2 = state & CONDITION_2 != 0
has_condition_3 = state & CONDITION_3 != 0

print(f"Condition 1: {has_condition_1}")
print(f"Condition 2: {has_condition_2}")
print(f"Condition 3: {has_condition_3}")

위 코드에서, state는 조건 1과 조건 2를 만족하는 상태입니다. 따라서 has_condition_1has_condition_2True를 반환하고, has_condition_3False를 반환합니다.

이와 같이 다중조건을 비트로 표현하고 조작하면 여러 조건을 동시에 효율적으로 관리하고 검사할 수 있습니다. 이를 통해 복잡한 조건 처리를 간단하고 빠르게 할 수 있습니다.