PS 문제를 다시 시작한다. 한동안 안풀었더니 다 까먹었다.

매일매일 조금씩 실력을 갈고 닦아야 좋은 기회가 왔을 때 잡을 수 있으니...

 

블로그도 겸사겸사 다시 작성한다는 마음으로 시작하니까 부담은 적은 것 같다. 시작이 반이라는 말이 있으니깐.

우선은 오늘은 감을 익히기 위해 '수학' 파트를 풀려고 한다.

앞으로 매일매일은 아니더라도, 꾸준히 문제를 풀 예정이다. DP, DFS, BFS ... KMP 까지도 가야 한다.

 


문제 풀이를 할 때 마다 계속 추가됩니다.

cmd + F 를 통해 문제번호 찾기를 추천드립니다.

 

 

25.01.11 업데이트

25.01.18 업데이트

 

아래 깃허브 주소에서 백준 Swift 문제풀이를 확인하실 수 있습니다.

https://github.com/SuminPark-developer/BaekJoonPS

 

GitHub - SuminPark-developer/BaekJoonPS: 백준 Swift PS

백준 Swift PS. Contribute to SuminPark-developer/BaekJoonPS development by creating an account on GitHub.

github.com


백준 Swift 2581번

문제 유형 : 수학

난이도 : 브론즈 2

'에라토스테네스의 체' 사용

단, 숫자가 커지면 메모리때문에 단일 숫자 소수 체크 사용하여야 함. (for i in 2..<Int(Sqrt(Double(n)) + 1)

// MARK: - 2581번
import Foundation

let M = Int(readLine()!)!
let N = Int(readLine()!)!

var isPrimary = [0] + Array(repeating: 0, count: N)

if N == 1 {
    print(-1)
    exit(0)
}

for i in 2...N {
    isPrimary[i] = i
}

for i in 2...N {
    if isPrimary[i] == 0 {
        continue
    }
    for j in stride(from: i*2, through: N, by: i) {
        isPrimary[j] = 0
    }
}

let sum = Array(isPrimary[M...N]).filter{$0 != 0}.reduce(0, +)
if sum == 0 {
    print(-1)
}
else {
    print(sum)
    let min = Array(isPrimary[M...N]).filter{$0 != 0}.first!
    print(min)
}

 


백준 Swift 22864번

문제 유형 : 수학

난이도 : 브론즈2

// MARK: - 22864번
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (A, B, C, M) = (input[0], input[1], input[2], input[3])

var (tired, worked) = (0, 0)

for _ in 1...24 {
    if (tired + A) <= M { // 일 가능
        tired += A
        worked += B
    }
    else { // 일 불가능
        tired -= C
        if tired < 0 { tired = 0 } // 단, 피로도가 음수가 될 순 없음.
    }
}

print(worked)

 


백준 Swift 1978번

문제 유형 : 수학

난이도 : 브론즈2

// MARK: - 1978번
import Foundation
let N = Int(readLine()!)!
let input = readLine()!.split(separator: " ").map{Int(String($0))!}

func isPrimary(_ n: Int) -> Bool {
    if n < 2 {
        return false
    }
    for i in 2..<Int(sqrt(Double(n)) + 1) {
        if n % i == 0 {
            return false
        }
    }
    return true
}

//func isPrimary(_ num: Int) -> Bool {
//    if num < 4 {
//        return num == 1 ? false : true
//    }
//    for i in 2...Int(sqrt(Double(num))) {
//        if num % i == 0 {
//            return false
//        }
//    }
//    return true
//}

print(input.filter{isPrimary($0) == true}.count)

 


백준 Swift 2745번

문제 유형 : 수학

난이도 : 브론즈 2

// MARK: - 2745번
import Foundation
let input = readLine()!.split(separator: " ").map{String($0)}
let (N, B) = (input[0], input[1])

let result = Int(N, radix: Int(B)!)! // B진수 -> 10진수로 변환
print(result)

 


백준 Swift 5618번

문제 유형 : 수학

난이도 : 브론즈2

// MARK: - 5618번
let n = Int(readLine()!)!
let input = readLine()!.split(separator: " ").map{Int(String($0))!}.sorted(by: <)
let lastNum = input.first!

var answer: [Int] = []

for i in 1...lastNum {
    var isCd = true // 공약수 체크 플래그
    for num in input {
        if num % i != 0 {
            isCd = false
            break
        }
    }
    if isCd {
        answer.append(i)
    }
}

for ans in answer {
    print(ans)
}

 


백준 Swift 1110번

문제 유형 : 수학

난이도 : 브론즈1

// MARK: - 1110번
var N = Int(readLine()!)!
let originalN = N
var count: Int = 0

while true {
    if N < 10 { // 한자리 수
        N = N * 10 + N
    }
    else { // 두자리 수
        let (A, B) = (N / 10, N % 10)
        N = (B * 10) + ((A + B) % 10)
    }
    count += 1
    
    if N == originalN {
        print(count)
        break
    }
}

 


백준 Swift 11653번

문제 유형 : 수학

난이도 : 브론즈1

// MARK: - 11653번
var N = Int(readLine()!)!

for i in stride(from: 2, to: N, by: 1) {
    while N % i == 0 { // i로 계속 나눠줌.
        N = N / i
        print(i)
    }
}

if N != 1 { // 맨 마지막이 소수라면 출력해줘야 함. ex) 7
    print(N)
}

 


백준 Swift 1934번

문제 유형 : 수학

난이도 : 브론즈1

// MARK: - 1934번(최소공배수)
let T = Int(readLine()!)!
for _ in 0..<T {
    let input = readLine()!.split(separator: " ").map{Int(String($0))!}.sorted(by: >)
    let (A, B) = (input[0], input[1])
    
    print(lcm(A, B))
}


func gcd(_ a: Int, _ b: Int) -> Int { // 최대공약수
    return b == 0 ? a : gcd(b, a % b)
}

func lcm(_ a: Int, _ b: Int) -> Int { // 최소공배수
    return a * b / gcd(a, b)
}

 


백준 Swift 2609번

문제 유형 : 수학

난이도 : 브론즈1

// MARK: - 2609번(최대공약수, 최소공배수)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}.sorted(by: >)
let (A, B) = (input[0], input[1])

print(gcd(A, B))
print(lcm(A, B))

func gcd(_ a: Int, _ b: Int) -> Int {
    return b == 0 ? a : gcd(b, a % b)
}

func lcm(_ a: Int, _ b: Int) -> Int {
    return a * b / gcd(a, b)
}

 


 

반응형