【Python】白俊1193号噴水を探して


質問する



に答える


まず規則性を見てみましょう.

以上のように線分を1本増やすごとに線分内の分数個数は+1の等差数列となる.
また、線は「奇数時左」から、「偶数時右」からカウントを開始します.
5本目の線を例にとるとこのような様子です.
5는 홀수이므로 왼쪽에서 시작하며 (위 그림참조) 5개의 분수를 가지고 있다
1번째 분수 5      / 1
2번째 분수 4 (-1) / 2 (+ 1)
3번째 분수 3 (-1) / 3 (+ 1)
4번째 분수 2 (-1) / 4 (+ 1)
5분째 분수 1 (-1) / 5 (+ 1)
すなわち,xの2番目のスコアを求めるために,どの線上にあるかを決定することから,xを含むn線上に,前の線上に含まれるスコアの数を減算し,残りの数を計算する.
例えば、14番目の点数を要求すると
line 1 :			1			count =  1		x -= count	(x = 13)
line 2 :		   3 2 <-		count += 1		x -= count	(x = 11)
line 3 :	   -> 4 5 6			count += 1		x -= count	(x = 8)
line 4 :		10 9 8 7 <-		count += 1		x -= count	(x = 4)
line 5 :   -> 11 12 13 14 15	x는 4이고 line이 홀수 이므로 왼쪽에서부터 4번째 분수를 의미한다

私が説明したコード


私が初めて問題を解く方法は
x = int(input())
n = 0 # 라인의수

while x > 0: # x가 포함된 라인찾기
  n += 1     # 라인 카운트
  x -= n     # 카운트한 분수의 갯수 빼기
  
x *= -1 # 양수로 바꿔주기

if n % 2 == 0: # 라인이 짝수일때 오른쪽에서부터 카운트
  for i in range(n): #처음 분수를 짝수이기 떄문에 [n,1] 잡고 카운트 시작
    if x == 0: # x의 자리를 찾는다면
      print(f'{n - i}/{i + 1}')
      break
    else:
      x -= 1 # x의 자리까지 카운트하기
else:	# 라인이 홀수일때 왼쪽에서부터 카운트 
  for i in range(n): #처음 분수를 홀수이기 떄문에 [1,n] 잡고 카운트 시작
    if x == 0:
      print(f'{i + 1}/{n - i}')
      break
    else:
      x -= 1
私が最初に説明した方法で白準に提出しても、通過するのは難しくありません.
しかし、他人の解題方法を見ると、コードを書くのがもっと簡潔な様子が見えます.
while x > 0: 
  n += 1     
  x -= n 
このコード
while x > n:
  x -= n   
  n += 1
このように変更できます.
xの位置を−(n−1)~0と考え,以下でxの記号を変えた.
jsshaneのコードは,xの位置がxがnより小さいだけであれば,xの位置を求めるだけでよい.
不思議なことに、計算されたxの値が3で、line(n)が5であれば
5番目の線上で、左から3番目の点数を求めればいいです
if a % 2 == 0:
  for i in range(a):
    if x == 0:
      print(f'{a - i}/{i + 1}')
      break
    else:
      x -= 1
else:
  for i in range(a):
    if x == 0:
      print(f'{i + 1}/{a - i}')
      break
    else:
      x -= 1
このコードはxの位置を計算することもでき、ドアを使わない.
たとえば、以前の私のコードはxが13の場合です.
x    = 13 -> 12 -> 10 -> 7 -> 3 -> -2 (0부터 계산하므로 3번째에 속한다)
line = 1  -> 2  -> 3  -> 4 -> 5
x 5番目の線の始点から3番目の値を算出する
5番目の線は奇数[1,5]->[2,4]->[3,3]で答えが見つかった
  if n % 2 == 0:
      print(f'{x}/{n - x + 1}')
  else:
      print(f'{n - x + 1}/{x}')
これは残りのxが得たい値です.
x 	 = 13 -> 12 -> 10 -> 7 -> 3
line = 1  -> 2  -> 3  -> 4 -> 5
上記の結果に示すように、第五条線上で第三条に属する値を求めればよい
[5, 1][4, 2][3, 3][2, 4][1, 5]
この行は奇数行で、左から3番目の値です.
つまり、[3,3].
x番目のスコアは
lineが偶数の場合[whlie文は前のx値、line-whlie文は前のx値+1]
lineが奇数の場合[line-whlie文は前のx値+1、whlie文は前のx値]
表現できる

新しいコード

x = int(input())
n = 1
while x > n:
    x -= n
    n += 1
if n % 2 == 0:
    print(f'{x}/{n - x + 1}')
else:
    print(f'{n - x + 1}/{x}')
これは簡潔で分かりやすいコードになりました