TIL/알고리즘 공부

백준 1193번 Swift 알고리즘 연습

여의도사노비 2022. 8. 24. 12:32
728x90

지그재그로 움직이는 분수의 값을 산출하는 문제이다.

편의상 좌측에 나눈 단계별로 특징을 지니고 있다.

1, 3, 5.. 의 홀수 단계와 2, 4, ... 의 짝수 단계가 분수를 이루는 모습이 정반대인 것을 알 수 있을 것이다.

이러한 특성을 이용하여

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. 입력 받는 값이 어느 단계(1...)에 해당하는 값인지를 찾는다.
  2. 그 단계가 홀수인지 짝수인지 분별한다.
  3. 홀수의 경우 for 문 안에 '(count - j + 1) / j' 수식을 사용하여 배열을 만들어준다.
  4. 짝수의 경우 for 문 안에 'j / (count - j + 1)' 수식을 사용하여 배열을 만들어준다.
  5. 초기 입력된 값이 array 내에 몇번째 숫자인지 index를 확인한다.

사실 이 문제는 정~말 오랜시간이 걸린 것 같다.

논리적 특성은 금방 찾았지만 일단 입력 받는 값이 어느 단계에 속하는지를 수식으로 정리하는 것이 특히 오래 걸린 것 같다.

그래서 여러 글들을 참고하여 내가 가장 쉽게 이해한 방식으로 재코딩하였다.

 

 

* 1193번

let X = Int(readLine()!)!
var sum = 0
var count = 0
var arr: [String] = []

for i in 1...X {
    sum += i
    count += 1
    if sum >= X {
        break
    }
}

var isOdd: Bool {
    return count % 2 == 0 ? false : true
}

if isOdd {
    for j in 1...count {
        arr.append("\(count - j + 1)/\(j)")
    }
}else {
    for j in 1...count {
        arr.append("\(j)/\(count - j + 1)")
    }
}

var index = arr.count - (sum - X) - 1
print("\(arr[index])")

 

 

정리(Today I Learned)

  1. 없음