VesselWheel

3진법 뒤집기 본문

Coding Test Practice in Swift

3진법 뒤집기

JasonYang 2024. 2. 2. 10:27

3진법 뒤집기 코딩테스트 문제를 풀기 전에 3진법을 활용하는 이유가 궁금해졌다. 

왜 3진법이 나왔을까?

수학적 모델에 있어서 3진법은 활용될 수 있다. 

더보기
  1. 전자기기의 세그먼트 디스플레이: 일부 전자기기에서는 7세그먼트 디스플레이를 사용하여 숫자를 표시합니다. 7세그먼트 디스플레이는 각 숫자를 표현하기 위해 7개의 세그먼트를 사용하는데, 이때 3진법을 사용하여 숫자를 표현할 수 있습니다. 예를 들어, 0부터 9까지의 숫자를 3진법으로 표현하면 다음과 같이 됩니다: 0(00), 1(01), 2(10), 3(11), 4(100), 5(101), 6(110), 7(111), 8(1000), 9(1001). 이렇게 3진법을 사용하면 세그먼트 디스플레이에서 숫자를 표현하기가 편리해집니다.
  2. 시계의 시, 분, 초 표시: 시계에서 시, 분, 초를 표시하는 디지털 시계나 아날로그 시계에서는 기본적으로 10진법을 사용하지만, 일부 디지털 시계나 타이머에서는 3진법을 사용하여 시, 분, 초를 표시하기도 합니다. 이를 통해 숫자의 표현이 간소화되고, 디스플레이의 자리수가 줄어들어 제작 및 표시가 편리해집니다.
  3. 색상 표현: 컬러 시스템에서는 각 색을 표현하기 위해 RGB(Red, Green, Blue) 값이 사용됩니다. 각 색상의 강도를 0부터 255까지의 10진법 숫자로 표현할 수도 있지만, 일부 경우에는 3진법을 사용하여 표현하기도 합니다. 예를 들어, 강도를 0부터 2까지의 3진법 숫자로 표현한다면, 각 색상을 더 적은 비트로 표현할 수 있으며, 이는 저장 공간을 절약하고 처리 속도를 향상시킬 수 있습니다.

이처럼 3진법은 전자기기나 색상 표현 등의 일부 사례에서 활용될 수 있으며, 효율적인 표현이나 처리를 위해 사용될 수 있습니다.

문제

https://school.programmers.co.kr/learn/courses/30/lessons/68935

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

import Foundation

func solution(_ n: Int) -> Int {
    var ternaryDigits = [Int]()
    var num = n
    
    while num > 0 {
        ternaryDigits.append(num % 3)
        num /= 3
    }
    
    var result = 0
    var power = 1
    
    for i in stride(from: ternaryDigits.count - 1, through: 0, by: -1) {
        result += ternaryDigits[i] * power
        power *= 3
    }
    
    return result
}

let n = 45
let reversedDecimal = solution(n)
print(reversedDecimal) // 출력 결과: 7

해석

solution 함수는 주어진 자연수 n을 3진법으로 변환한 후, 이를 뒤집어 다시 10진법으로 표현하는 역할을 합니다.

먼저, ternaryDigits라는 배열을 선언합니다.

이 배열은 num % 3으로 3으로 나눈 나머지를 배열에 저장함으로써 n을 3진법으로 변환하였고, 3진법으로 된 나머지 숫자의 각 자리수를 저장할 것입니다.

그리고 num 변수에는 초기에 입력받은 n을 저장하고, while 반복문을 사용하여 num이 0보다 클 때까지 반복합니다.

반복문 안에서는 num을 3으로 나눈 나머지를 ternaryDigits 배열에 추가하고, num을 3으로 나눈 몫을 다시 num에 저장합니다.

이 과정을 반복하면 num이 0이 되면서 n을 3진법으로 변환한 숫자의 각 자리수가 ternaryDigits 배열에 역순으로 저장됩니다.

그 다음, result 변수를 선언하고 초기값을 0으로 설정합니다.

power 변수는 10진법으로 표현하기 위한 자리수를 나타내는 변수로 초기값을 1로 설정합니다.

for 반복문을 사용하여 ternaryDigits 배열의 뒤에서부터(ternaryDigits.count -1) 순서대로 접근합니다. 반복문 안에서는 result에 현재 자리수의 3진법 숫자를 10진법으로 변환한 값을 더하고, power에 3을 곱해 다음 자리수로 이동합니다.

->즉, 3진법으로 된 숫자에 3을 곱함으로써 10진법으로 전환된다. 

 

마지막으로, result 값을 반환하여 10진법으로 표현된 뒤집힌 3진법 숫자를 출력합니다.

예시로 주어진 n이 45인 경우, solution 함수를 호출하면 3진법으로 변환한 뒤 뒤집어진 10진법 숫자인 7이 반환됩니다.

 

cf. stride 매소드 란?

더보기

stride 메서드는 특정 범위에서 값을 생성하는 메서드입니다. 주어진 시작 값부터 종료 값까지 일정한 간격으로 값을 생성합니다.

stride 메서드는 다음과 같은 형태로 사용됩니다: stride(from: 시작 값, to: 종료 값, by: 간격)

  • from: 시작 값입니다. 이 값부터 시작하여 값을 생성합니다.
  • to: 종료 값입니다. 이 값에 도달하면 생성을 종료합니다. 종료 값은 생성된 값에 포함되지 않습니다.
  • by: 간격입니다. 시작 값으로부터 얼마씩 증가 또는 감소할지를 지정합니다.

stride 메서드는 주로 반복문에서 사용되며, 특정 범위에서 값을 생성하고자 할 때 유용합니다. stride 메서드를 사용하면 일정한 간격으로 숫자를 생성하거나, 역순으로 값을 생성할 수 있습니다.

상기 코드에서 stride 메서드는 ternaryDigits 배열을 거꾸로 순회하기 위해 사용되었습니다. ternaryDigits.count - 1부터 시작하여 0까지 역순으로 반복하며, by 매개변수에 -1을 지정하여 한 단계씩 감소하도록 설정하였습니다. 이를 통해 ternaryDigits 배열의 요소들을 역순으로 접근하면서 값을 계산하고 있습니다.