인프런 커뮤니티 질문&답변

leedoy7989님의 프로필 이미지
leedoy7989

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

최적화 (정수론) - ( 난이도 ⭐️⭐️⭐️⭐️⭐️ , 스킵하셔도 괜찮습니다. )

11653번 (2강 최적화) 질문이있습니다.

해결된 질문

작성

·

173

1

아래와 같이 완전탐색(?)을 이용해 작성하였는데요, 말씀하신 최적화 방법(약수를 구할때는 해당 수의 제곱근까지만 구해도 약수의 개수와 약수를 구할 수 있다)으로 어떻게 코드를 최적화 할 수 있을지 잘 모르겠습니다.

 

let input = readLine().map { Int($0)! }!

var answer: [Int] = []
var previous = input

func check(i: Int, divided: Int) -> Bool {
    if divided % i == .zero {
        answer.append(i)
        previous = divided / i
        return true
    } else {
        return false
    }
}

if input == 1 {
    
} else {
    for i in 2...(input) {
        var flag = true

        repeat {
            let check = check(i: i, divided: previous)
            flag = check
        } while flag
    }
    
    answer.compactMap { print(String($0)) }
}

 

답변 2

1

leedoy7989님의 프로필 이미지
leedoy7989
질문자



 최적화
 보석값 입력 받기
let gem = readLine().map { Double($0)! }!


//소인수 분해해야함.
var answers: [Int] = []
var previous = Int(gem)
var squreRoot = Int(Double(gem).squareRoot())

func check2(divided: Int, i: Int) -> Bool {
    if divided % i == .zero {
        previous = divided / i
        answers.append(i)
        return true
    } else {
        return false
    }
}
//2,3,4
for i in 2...squreRoot {
    var flag = true
    repeat {
      let result = check2(divided: previous, i: i)
        flag = result
    } while flag
}

if previous != 1 {
    answers.append(previous)
}


answers.sort()
print(answers.count)
print(answers.compactMap { String($0) }.joined(separator: " "))

통과한 답변 공유합니다~

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

공유 감사합니다!😄

1

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

질문 감사합니다 :)!!!

 

저는 아래와 같은 방법으로 최적화를 했습니다 🙂

강의 우측 상단에 보시면 강의자료 다운로드가 가능합니다 !

거기에 제 코드도 있으니 풀어보시고 어려우시면 참고자료로 사용해주세요!

 

최적화 전 (BOJ https://www.acmicpc.net/problem/11653 )

numbers = int(input())
d = 2
while d <= numbers: 
    if numbers % d == 0: 
        print(d) 
        numbers = numbers / d 
    else: 
        d = d + 1

 

최적화 후 (BOJ https://www.acmicpc.net/problem/14232 )

number = int(input())

answer = []

for i in range(2, (int(number**0.5) +1)):

    while(number % i == 0):

        answer.append(i)

        number //= i   

if number != 1 :

    answer.append(number)

print(len(answer))

print(*answer)
leedoy7989님의 프로필 이미지
leedoy7989
질문자

답변감사합니다~ 강의자료 다운로드 받아도 지원되는 포맷이 아니라고 뜹니다ㅜㅜ

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

브라우저가 혹시 지금 사파리이신가요?

 

크롬 브라우저로 확인 가능하시면 부탁드리겠습니다!

 

아마도, 웹 브라우저 OS에 따라서 버그가 있는 것 같네요.. 😢 죄송합니다..!

leedoy7989님의 프로필 이미지
leedoy7989
질문자

엇 아뇨 크롬에서 강의 듣고있습니다! 시크릿모드도 아니구요..!

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

혹시 다른 zip 파일은 압축해제가 잘 될까요?

 

인프런 파일만 문제 발생하고 있다면 제가 인프런 측에 문의해서 답변 요청하겠습니다!

leedoy7989님의 프로필 이미지
leedoy7989
질문자

네! 다른 압축파일은 잘 풀립니다~!

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

인프런 측에 문의해뒀습니다! 답변 오는대로 여기에 답글 달겠습니다 🙂 감사합니다!

leedoy7989님의 프로필 이미지
leedoy7989

작성한 질문수

질문하기