처음에 문제를 접했을 때는 2차원 배열을 선언하여 모든 수를 넣어줘야 하나? 라는 생각이 들었다. 하지만 그렇게 되면 메모리의 소모가 굉장히 클것이기 때문에 규칙성을 찾으려 노력했다.
숫자를 알때에는 숫자에서 1부터 n까지 빼다보면 숫자가 음수가 될 때가 있다. 이때 음수가 된 숫자가 의미하는 것은 대각선 라인에서 마지막에서 몇번째인가? 이고, 마지막으로 뺀 수가 의미하는 것은 몇번째 라인인가?이다. 이 두가지가 있다면 우리는 좌표를 알아낼 수 있다.
좌표를 알때에는 그의 반대로 진행하면 된다.
모든 대각선은 y=-x+a의 형태이기 때문에 x+y=a로 몇번째 라인인지 알 수 있다. 이렇게 x+y로 몇번째 라인인지 알아낸 후에 n번째라인일 경우에 1부터 n까지 더한후에 x를 더해주면 그 좌표에 정해진 숫자를 알 수 있다.
p, q = map(int, input().split())
# y = -x + a임을 이용
a_p = 0
a_q = 0
for i in range(200):
if p > 0:
p = p-i # 그 라인에서 몇번째에 위치한지를 알 수 있음
a_p = i # 몇번째라인에 위치한지 알 수 있음
if q > 0:
q = q-i
a_q = i
p_x = a_p + p # 몇번째라인인지에서 음수인 p를 더하면 x값이 나옴
p_y = abs(p)+1 # 좌표 y는 p를 양수로 바꾸고 1을 더하면 그 값이 나옴
q_x = a_q + q
q_y = abs(q)+1
result_x = p_x+q_x
result_y = p_y+q_y
result = 0
len_res = result_x+result_y
for i in range(len_res-1):
result += i
result += result_x
print(f'#{test_case} {result}')
T = int(input())
for test_case in range(1, T + 1):
p, q = map(int, input().split())
# y = -x + a임을 이용
a_p = 0
a_q = 0
for i in range(200):
if p > 0:
p = p-i # 그 라인에서 몇번째에 위치한지를 알 수 있음
a_p = i # 몇번째라인에 위치한지 알 수 있음
if q > 0:
q = q-i
a_q = i
p_x = a_p + p
p_y = abs(p)+1
q_x = a_q + q
q_y = abs(q)+1
result_x = p_x+q_x
result_y = p_y+q_y
result = 0
len_res = result_x+result_y
for i in range(len_res-1):
result += i
result += result_x
print(f'#{test_case} {result}')
안녕하세요.
궁금한 점이 있어서 질문드리는데 답변주시면 감사드리겠습니다.