TIL/알고리즘 공부

백준 2525, 2480번 Swift 알고리즘 연습

여의도사노비 2022. 3. 22. 18:50
728x90

앱 실전으로 만들어 보는것 보다 알고리즘 푸는게 더 재밌다 요즘은.. 아직 문제가 쉬워서 그런가보군 ㅋ-ㅋ

 

* 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])
}

요리를 하는데 걸리는 시간이 1000분으로 제한이 있지 않았다면 코드에 제약이 더 들어갔을텐데.. 일단 이 정도로 진행!

 

  • 시간 문제를 풀며 특히나 인풋에 있어 제한적인 요소들(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)
}

if의 케이스가 더 늘어날 경우 어떻게 대처할 것인가가 앞으로의 관건..!

  • 머리 속으로는 (+, +), (-, +) 등의 사분면 개념을 기준으로 케이스를 적용하면 어떨까 했는데, 오히려 4가지 케이스를 정의 내리는 과정이 더 걸릴 거 같아서 그냥 if 문으로 진행했다.

 

 

정리(Today I Learned)

  1. if알고리즘 문제를 풀며 가장 크게 느끼는 건 수학 문제에서 경우의 수를 주제로 문제를 푸는 것과 비슷하다는 점이다.
  2. 경우의 수 문제의 경우 쉬운 문제들은 보통 케이스를 일일히 분류하여 값을 계산할 수 있다.
  3. 하지만 심화 과정으로 넘어갈 수록 케이스에 대해서 직접 하나하나 분류하기 힘들어지기에, 이를 효과적으로 분류하고 산출해낼 수 있는 스킬들이 필요해진다.
  4. 결국 작은 케이스를 다룰때도 큰 케이스를 염두에 두고 정형화, 분류화하는 작업을 진행해보아야 실력이 늘것 같다.