Where who wants to meet someone

배열의 길이를 2의 거듭제곱으로 만들기 본문

프로그래머스 알고리즘 문제 기록/코딩 기초 트레이닝

배열의 길이를 2의 거듭제곱으로 만들기

Lust3r 2024. 2. 8. 10:16
728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

내 답안 / 다른 사람들의 답안

import Foundation

func solution(_ arr:[Int]) -> [Int] {
    var arr = arr
    var powArr = [Int]()

    for i in 0...10 {
        powArr.append(Int(pow(2.0, Float(i))))
    }

    if powArr.contains(arr.count) {
        return arr
    } else {
        while !powArr.contains(arr.count) {
            arr.append(0)
        }

        return arr
    }
}

- arr의 길이는 최대 1,000이기 때문에 2의 거듭제곱 중 1000과 근사한 1024까지만 비교하면 된다.

- powArr에 for문을 통해 0부터 10까지 2의 거듭제곱을 한 값을 넣어준다(1 ~ 1024)

- arr의 길이가 powArr에 포함되는 값이면 바로 반환하고, 아니라면 포함되는 값이 될 때까지 0을 더해주고 반환했다.

 

// 풀이 1
import Foundation

func solution(_ arr:[Int]) -> [Int] {
    var i = 1
    while i < arr.count { i <<= 1 }
    return arr + Array(repeating: 0, count: abs(arr.count - i))
}

// 풀이 2
import Foundation///

func solution(_ arr:[Int]) -> [Int] {
    let t = [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
    var arr = arr
    while !t.contains(arr.count) {
        arr.append(0)
    }
    return arr
}

- 풀이 1에서 i가 arr.count보다 작다면 왼쪽으로 1비트 시프트 하는 작업(2배로 곱하는)을 수행

- 반복문이 끝나면 i는 arr의 길이와 같거나 큰 2의 거듭제곱이 됨

- arr의 길이와 i값의 차이만큼 0을 반복한 배열을 기존 배열에 더해서 반환

 

점수: +10