본문 바로가기

알고리즘

python 백준1193 분수찾기(BOJ1193)

문제링크 : https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net

구현문제는 규칙을 뽑아내면 코드로 만드는것자체는 어렵지 않은것같다

그런데 처음 문제를 읽으면 '이걸 뭐 어쩌라고?' 생각이 들긴하는데 일단 예시를 손으로 쓰면서

규칙을 찾는 연습을 해야겠다 뭐 하다보면 늘지않을까?

x = int(input())

row = 1
col = 1 

jump = False
v = 1
multiple = 1

while True:
  if x == v:
    break
  if jump :
    v += (4 * multiple)
    multiple += 1
    jump = False
    col += 1
    if x <v:
      col -= (v-x)
      row += (v-x)
      break
  else :
    v += 1
    jump = True
    col += 1
    if x < (v+col):
      col -= (x-v)
      row += (x-v)
      break
print(str(row)+"/"+str(col))

처음엔 컬럼을 기준으로 +1, +4의배수 가 반복되는걸로 해서 풀었고 통과도 됐다 

그런데 너무 지저분하고 맘에 안들어서 다른방법으로 변경했다

#입력
x = int(input())

row = 1
col = 1 

#대각선을 층으로
layer = 1

#layer의 max값
v = 0

while True:
  v += layer
  if x <=v:
    if layer % 2 ==0:
      row = layer - (v - x)
      col = 1 + (v - x)
    else:
      row = 1 + (v - x)
      col = layer - (v - x)
    break
  layer += 1

#출력
print(f"{row}/{col}")

지그재그로 왔다갔다 하기때문에 대각선을 하나의 층으로 보고 입력으로 받은 값을 기준으로 층을 찾은다음

짝수, 홀수별로 값을 계산해서 출력했다

솔직히 사용한 메모리양도, 시간도 첫번째 코드와 두번째 코드가 똑같지만 이해하기 쉽다는 측면에서

두번째 코드가 더 낫지 않을까 생각한다

항상 말하지만 다른사람들의 코드를 보면 어마무시한게 차고 넘치게 많다