Fizz Buzz

Fizz Buzz는 아이들에게 나눗셈을 가르치기 위한 단체 단어 게임이다. 참가자들은 차례대로 숫자를 세며, 3으로 나누어 떨어지는 숫자는 "fizz"로, 5로 나누어 떨어지는 숫자는 "buzz"로 바꾼다.

Fizz Buzz는 컴퓨터 프로그래머를 위한 인터뷰 선별 도구로도 사용된다.

예제

일반적인 Fizz Buzz의 결과는 다음과 같다:

1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, ...

모듈로 연산자

모듈로 연산자 %는 fizz buzz 문제를 해결하는 핵심이다.

모듈로 연산자는 정수 나눗셈 후 남은 나머지를 반환한다. 다음은 모듈로 연산자의 예제다:

나눗셈 나눗셈 결과 모듈로 모듈로 결과
1 / 3 0, 나머지 3 1 % 3 1
5 / 3 1, 나머지 2 5 % 3 2
16 / 3 5, 나머지 1 16 % 3 1

숫자가 짝수인지 홀수인지 판단하는 일반적인 방법은 모듈로 연산자를 사용하는 것이다:

모듈로 결과 Swift 코드 Swift 코드
결과
설명
6 % 2 0 let isEven = (number % 2 == 0) true 숫자가 2로 나누어 떨어지면 짝수
5 % 2 1 let isOdd = (number % 2 != 0) true 숫자가 2로 나누어 떨어지지 않으면 홀수

또는 Swift의 내장 함수인 .isMultiple(of:)을 사용할 수 있다. 예를 들어, 6.isMultiple(of: 2)는 true를 반환하고, 5.isMultiple(of: 2)는 false를 반환한다.

Fizz Buzz 문제 해결하기

이제 모듈러스 연산자 % 또는 .isMultiple(of:) 메서드를 사용해 Fizz Buzz 문제를 해결할 수 있다.

3으로 나누어 떨어지는 숫자를 찾는 방법:

모듈러스 모듈러스
결과
모듈러스 사용
Swift 코드
.isMultiple(of:) 사용
Swift 코드
Swift 코드
결과
1 % 3 1 1 % 3 == 0 1.isMultiple(of: 3) false
2 % 3 2 2 % 3 == 0 2.isMultiple(of: 3) false
3 % 3 0 3 % 3 == 0 3.isMultiple(of: 3) true
4 % 3 1 4 % 3 == 0 4.isMultiple(of: 3) false

5로 나누어 떨어지는 숫자를 찾는 방법:

모듈러스 모듈러스
결과
모듈러스 사용
Swift 코드
.isMultiple(of:) 사용
Swift 코드
Swift 코드
결과
1 % 5 1 1 % 5 == 0 1.isMultiple(of: 5) false
2 % 5 2 2 % 5 == 0 2.isMultiple(of: 5) false
3 % 5 3 3 % 5 == 0 3.isMultiple(of: 5) false
4 % 5 4 4 % 5 == 0 4.isMultiple(of: 5) false
5 % 5 0 5 % 5 == 0 5.isMultiple(of: 5) true
6 % 5 1 6 % 5 == 0 6.isMultiple(of: 5) false

코드 예제

Swift에서 Modulus 방식을 사용한 간단한 구현은 다음과 같다.

func fizzBuzz(_ numberOfTurns: Int) {
  for i in 1...numberOfTurns {
    var result = ""

    if i % 3 == 0 {
      result += "Fizz"
    }

    if i % 5 == 0 {
      result += (result.isEmpty ? "" : " ") + "Buzz"
    }

    if result.isEmpty {
      result += "\(i)"
    }

    print(result)
  }
}

Swift에서 .isMultiple(of:)와 switch 문을 사용한 간단한 구현은 다음과 같다.

func fizzBuzz(_ numberOfTurns: Int) {
    guard numberOfTurns >= 1 else {
        print("Number of turns must be >= 1")
        return
    }
    
    for i in 1...numberOfTurns {
        switch (i.isMultiple(of: 3), i.isMultiple(of: 5)) {
        case (false, false):
            print("\(i)")
        case (true, false):
            print("Fizz")
        case (false, true):
            print("Buzz")
        case (true, true):
            print("Fizz Buzz")
        }
    }
}

위 코드 중 하나를 플레이그라운드에 넣고 다음과 같이 테스트한다.

fizzBuzz(15)

출력 결과는 다음과 같다.

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
Fizz Buzz

참고 자료

위키피디아의 Fizz buzz

원본 작성자: Chris Pilcher

업데이트 담당: Lance Rettberg