[Swift] 백준 1193번: 분수찾기

Logan·2021년 3월 23일
1
post-custom-banner

1193번: 분수찾기

문제링크

let X = Int(readLine()!)!
var isTopToDown = true
var count = 0

OUTER: for x in 1...X {
    isTopToDown = x.isMultiple(of: 2) ? true : false
    
    for num in 1...x {
        count += 1
        if count == X {
            isTopToDown ? print("\(num)/\(x - num + 1)") : print("\(x - num + 1)/\(num)")
            break OUTER
        }
    }
}

1/1 1/2 1/3 1/4 1/5 …
2/1 2/2 2/3 2/4 … …
3/1 3/2 3/3 … … …
4/1 4/2 … … … …
5/1 … … … … …
… … … … … …

=================================================================

1/1...
1/2 > 2/1...
3/1 > 2/2 > 1/3... 이런 순서대로 찾아나가야 합니다.
분자와 분모가 번갈아가면서 늘어나고 줄어들고 있는걸 활용해서 코드를 구현합니다.
(다른 분들은 한 번 사이클이 돌 때마다 합이 1이 되는 것도 활용하시더라구요)

  1. 반복문을 중첩으로 돌면서 바깥 반복문의 상수가 짝수일 땐 분자가 커지고
    홀수일 땐 분모가 커지는 분수를 만들어요.
  2. 바깥의 반복문을 내부에서도 컨트롤 하기 위해 OUTER를 붙여줍니다.
  3. 필요 이상의 반복을 피하기 위해 횟수가 한 번 지날때마다 count를 1씩 증가시켜주고, count와 주어진 X번째 수가 일치한다면 조건에 따라 문자열을 출력하고 break OUTER로 반복문을 종료시켜줍니다.
isTopToDown ? print("\(num)/\(x - num + 1)") : print("\(x - num + 1)/\(num)")

TIL...with trash

let X = Int(readLine()!)!

var isTopToDown = true
var fractions = [String]()
var count = 0

OUTER: for x in 1...X {
    isTopToDown = x.isMultiple(of: 2) ? true : false
    
    for num in 1...x {
        count += 1
        
        isTopToDown ? fractions.append("\(num)/\(x - num + 1)") : fractions.append("\(x - num + 1)/\(num)")
        if count == X { break OUTER }
    }
}

print(fractions[X-1])

시간초과를 발생시키는 쓸데없는 코드를 줄여야겠습니다.
print로 현재 반복문에서 돌고있는 문자열만 출력하고 break로 끝냈으면 됐는데,
굳이굳이 배열을 만들어서 배열 인덱스를 초과하다가 시간초과가 났습니다 😅

비록 한 번에 통과한 문제는 아니었지만(나름 두번째) 실패 원인이 무엇인지 파악하고 고쳐나가는 모습이 스스로가 대견합니다!

profile
iOS개발자 꿈나무
post-custom-banner

2개의 댓글

comment-user-thumbnail
2021년 3월 23일

When you have nothing else to do then you can try these free slots no download https://theinternetslots.com/ . Here you will find a lot of entertaining games that will help you to brighten up your life. I'm sure that you will like some of those. Good luck.

1개의 답글