본문 바로가기
Algorithm/문제풀이_백준

Swift) 백준 1193번(분수찾기)

by Joahnee 2021. 8. 5.

요구능력 : 대각선의 규칙을 찾느냐 못찾느냐

코드설명 

이렇게 대각선 지그재그로 간단다.

그럼 규칙을 찾아보면 한대각선당 분자분모의 합이 같다.

1/1 || 1/2, 2/1 || 3/1, 2/2, 1/3 || 1/4, 2/3, 3/2, 4/1 || 5/1, 4/2, 3/3, 2/4, 1/5 ...

이렇게 나온다.

그럼 각각 합은 2, 3, 4, 5, 6이 나오게된다.

각각 개수는 1, 2, 3, 4, 5가 나오게된다.

나는 for문을 이용해서 sum에다가 i씩 더하면서 X보다 크거나 같을 경우 루프를 빠져나가도록 작성했다.

왜? 본질적인 이유는 count 변수를 이용해서 구하고자 하는 구간의 합을 구하기 위함이다.

입력받는 값은 X번째 수 이다.

i를 위에서 말한 각각 개수라고 보면된다.

X번째 수라는 것은 수가 X개 있다는 말도된다.(?)

sum이 X보다 크거나 같으면 반복문을 그만둔다.(sum이 더 커지면 이미 count로 원하는 값을 구했기에 멈춰야한다.)


여기까지 했으면, 다음으로 생각할건 "분수를 어떻게 만들어서 출력해야되지?" 이다.

저 말을 상기하면서 위의 규칙을 본다면 보일것이다.

합이 홀수 일 때는 분모가 크고, 합이 짝수일 때는 분자가 크다.

그래서 isOdd를 선언해준것이다.

이후엔 간단하게,

for문을 통해서 배열에 넣은 뒤, sum과 x를 활용해서 index를 구하고 출력해줬다.

이런데서, index찾는 방법 Tip을 알려주자면 입력값에 따라서 index는 변해야되기 때문에 입력값이나 입력값과 연관된 변화하는 값을 이용해서 만드려고 하다보면 만들어진다.

 

후기 : 어렵진 않았는데 규칙찾는데 애먹었다..

let X = Int(readLine()!)!
var sum = 0 // 전체 구간의 개수의 합
var count = 1 // 구하고자하는 구간의 합
var arr: [String] = []

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

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

if isOdd {
    for j in 1..<count {
        arr.append("\(count - j)/\(j)")
    }
}else {
    for j in 1..<count {
        arr.append("\(j)/\(count - j)")
    }
}
var index = arr.count - (sum - X) - 1
print("\(arr[index])")

댓글