PS 문제를 다시 시작한다. 한동안 안풀었더니 다 까먹었다.
매일매일 조금씩 실력을 갈고 닦아야 좋은 기회가 왔을 때 잡을 수 있으니...
블로그도 겸사겸사 다시 작성한다는 마음으로 시작하니까 부담은 적은 것 같다. 시작이 반이라는 말이 있으니깐.
우선은 오늘은 감을 익히기 위해 '수학' 파트를 풀려고 한다.
앞으로 매일매일은 아니더라도, 꾸준히 문제를 풀 예정이다. DP, DFS, BFS ... KMP 까지도 가야 한다.
문제 풀이를 할 때 마다 계속 추가됩니다.
cmd + F 를 통해 문제번호 찾기를 추천드립니다.
25.01.11 업데이트
25.01.18 업데이트
아래 깃허브 주소에서 백준 Swift 문제풀이를 확인하실 수 있습니다.
https://github.com/SuminPark-developer/BaekJoonPS
백준 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)
}
반응형
최근댓글