[모각코] 24 하계모각코 6회차

임클·2024년 8월 4일
0

모각코 모음

목록 보기
22/22

Swift 문제풀이

[Bronze I] 피보나치 수 2 - 2748

문제 링크

성능 요약

메모리: 69100 KB, 시간: 12 ms

분류

다이나믹 프로그래밍, 수학

제출 일자

2024년 8월 2일 16:45:36

문제 설명

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.

출력

첫째 줄에 n번째 피보나치 수를 출력한다.

코트

let N = Int(readLine()!)!
    print(fibo(N))

    func fibo(_ x: Int) -> Int {
        if x == 0 { return 0 }
        else if x == 1 { return 1 }
        
        var dp = [Int](repeating: 0, count: x + 1)
        dp[0] = 0
        dp[1] = 1
        
        for i in 2...x {
            dp[i] = dp[i - 1] + dp[i - 2]
        }
        
        return dp[x]
    }

[Gold III] 프렉탈 평면 - 1030

문제 링크

성능 요약

메모리: 79512 KB, 시간: 12 ms

분류

분할 정복, 구현, 재귀

제출 일자

2024년 7월 25일 17:57:55

문제 설명

프렉탈 평면은 다음과 같이 커진다. 시간 0에서 프렉탈은 흰색 정사각형 하나이다. 단위 시간(1)이 진행될 때마다 N×N개의 크기가 동일한 단위 정사각형으로 나누어진다. 만약 나누어진 정사각형이 흰색이라면 가운데 K×K 정사각형이 검정색으로 채워진다. N과 K는 둘 다 홀수이거나, 둘 다 짝수이다.

예를 들어, N=3, K=1이라면, 시간 1에 3×3 정사각형이 된다. 가운데 정사각형은 검정색이고, 나머지는 흰색이 된다. 시간 2때 9×9 정사각형이 되고, 17개는 검정이고, 나머지는 흰색이다.

s, N, K, R1, R2, C1, C2가 주어질 때, 시간 s일 때, R1행 C1열부터 R2행 C2열까지의 모습을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 7개의 정수 s, N, K, R1, R2, C1, C2가 주어진다.

출력

첫째 줄에 문제의 정답을 출력한다. 첫째 줄에 R1행의 모습을 출력하고 이런 식으로 총 R2-R1+1개의 줄에 출력하면 된다. 각 행의 모습을 출력할 때, C1열부터 C2열까지 차례대로 흰색이면 숫자 '0' 검정이면 숫자 '1'을 출력한다. 숫자 사이에 공백을 넣으면 안 된다.

코드

import Foundation

let line = readLine()!.split { $0 == " " }.map { Int($0)! }
    let (s, N, K, R1, R2, C1, C2) = (line[0], line[1], line[2], line[3], line[4], line[5], line[6])

    let size = Int(pow(Double(N), Double(s)))

    for i in R1...R2 {
        var row = ""
        for j in C1...C2 {
            row += String(recur(size, i, j, N, K))
        }
        print(row)
    }

    func recur(_ t: Int, _ x: Int, _ y: Int, _ n: Int, _ k: Int) -> Int {
        if t == 1 {
            return 0
        }
        let tmp = t / n
        if (tmp * (n - k) / 2 <= x && x < tmp * (n + k) / 2) && (tmp * (n - k) / 2 <= y && y < tmp * (n + k) / 2) {
            return 1
        }
        return recur(tmp, x % tmp, y % tmp, n, k)
    }
profile
iOS를 공부하는 임클입니다.

0개의 댓글