Post
1493. 수의 새로운 연산 (SWEA) | Gihun Son

1493. 수의 새로운 연산 (SWEA)

※ SW expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

출처:

SW Expert Academy

나의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
T = int(input())
n_list=[0,1]
num=1
for i in range(2,300):
    num+=i
    n_list+=[num]
l=len(n_list)
for test_case in range(1, T + 1):
    p,q=map(int,input().split())
    #&연산
    for i in range(1,l):
        if n_list[i]>=p:
            pi=i
            break
    sp=n_list[pi]-p
    yp=1+sp
    xp=pi-sp
    for i in range(1,l):
        if n_list[i]>=q:
            qi=i
            break
    sq=n_list[qi]-q
    yq=1+sq
    xq=qi-sq
    xpq=xp+xq
    ypq=yp+yq
    # #연산
    find_i=xpq+ypq-1
    ans=n_list[find_i]
    ans-=(find_i-xpq)
    print(f'#{test_case} {ans}')
  • &, #연산에 따라 코드를 나누어 구현했다.
  • 가장 아래에 존재하는 수는 x의 좌표에 따라 1+2+3+4+…이 되는 규칙이 있다.
  • 따라서 x좌표가 5이고 y좌표가 1인 곳의 수는 1+2+3+4+5인 15이다.
  • 대각선의 수 중에서 가장 큰 수가 (x,1)의 수이기 때문에, 미리 (x,1)에 대한 모든 수를 저장해두고, 해당하는 좌표의 값보다 작은 경우, 해당 좌표의 대각선에 있다고 판단하였다.
  • 이 때, p,q의 최대값이 10000이라서 1~150까지의 합만 list에 저장하면 될 것이라고 생각했는데, 문제를 풀다보니 좌표를 더하면 300에 가까워질 수도 있었다. 따라서 1~300의 (x,1)에 대한 수의 합을 list에 저장해주었다.
  • 대각선의 있는 수와 (x,1)좌표의 수 차이는, 대각선 수의 x좌표와 (x,1)의 x좌표 차이와 같다.
  • 이를 이용하여 우선 대각선을 찾고, 숫자를 찾도록 코드를 작성하였다.
This post is licensed under CC BY 4.0 by the author.