백준 2525, 2480번 Swift 알고리즘 연습
앱 실전으로 만들어 보는것 보다 알고리즘 푸는게 더 재밌다 요즘은.. 아직 문제가 쉬워서 그런가보군 ㅋ-ㅋ
* 2525번
1)
let a = readLine()!.split(separator: " ").map{Int(String($0))!}
let b = readLine()!.split(separator: " ").map{Int(String($0))!}
let c: [Int]
let d: [Int]
c = a
d = b
if c[1] + d[0] >= 60 {
if a[0] + (a[1] + b[0]) / 60 >= 24 {
print(a[0] + (a[1] + b[0]) / 60 - 24, (a[1] + b[0]) % 60 )
} else {
print(a[0] + (a[1] + b[0]) / 60, (a[1] + b[0]) % 60 )
}
} else {
print(a[0], a[1] + b[0])
}
- 시간 문제를 풀며 특히나 인풋에 있어 제한적인 요소들(A: 0과 24사이, B: 0과 60사이, C: 0과 1000사이)이 신경쓰인다. 단계별로 진행해 나가면서 인풋 데이터의 제한에 대해서도 정의를 내리고 넘어가야할 것 같다.
* 2480번
1)
let a = readLine()!.split(separator: " ").map{Int(String($0))!}
let b: [Int]
b = a
if b[0] == b[1] && b[1] == b[2] {
print(b[0] * 1000 + 10000)
} else if b[0] == b[1] || b[1] == b[2] || b[0] == b[2] {
if b[0] == b[1] {
print(b[0] * 100 + 1000)
} else if b[1] == b[2] {
print(b[1] * 100 + 1000)
} else {
print(b[2] * 100 + 1000)
}
} else {
print(max(b[0], b[1], b[2]) * 100)
}
- 머리 속으로는 (+, +), (-, +) 등의 사분면 개념을 기준으로 케이스를 적용하면 어떨까 했는데, 오히려 4가지 케이스를 정의 내리는 과정이 더 걸릴 거 같아서 그냥 if 문으로 진행했다.
정리(Today I Learned)
- if알고리즘 문제를 풀며 가장 크게 느끼는 건 수학 문제에서 경우의 수를 주제로 문제를 푸는 것과 비슷하다는 점이다.
- 경우의 수 문제의 경우 쉬운 문제들은 보통 케이스를 일일히 분류하여 값을 계산할 수 있다.
- 하지만 심화 과정으로 넘어갈 수록 케이스에 대해서 직접 하나하나 분류하기 힘들어지기에, 이를 효과적으로 분류하고 산출해낼 수 있는 스킬들이 필요해진다.
- 결국 작은 케이스를 다룰때도 큰 케이스를 염두에 두고 정형화, 분류화하는 작업을 진행해보아야 실력이 늘것 같다.