난이도 : D3
문제번호 : 1493
※ 저의 풀이가 무조건적인 정답은 아닙니다.
다른 코드가 좀더 효율적이고 좋을 수 있습니다.
다른사람들의 풀이는 언제나 참고만 하시기 바랍니다.
문제 주소 및 출처입니다.
목차
1. 문제 설명
2. 문제 해석
3. 소스 코드
1. 문제 설명
2차원 평면 제 1사분면 위의 격자점 (x,y)에 위 그림과 같이 대각선 순서로 점에 수를 붙인다. |
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다. |
출력
각 테스트 케이스마다 ‘#t’(t는 테스트 케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 각 테스트 케이스마다 p★q의 값을 출력한다. |
예시
입력 | 출력 |
2 1 5 3 9 |
#1 13 #2 26 |
2. 문제풀이
개인적으로 멍청한짓을 해서 많이 고생했던 문제다. 계산하기가 매우 귀찮았기 때문에 차원 배열을 만들어 풀려고 했었다. 그러나... 생성하는데 역시나 크기가 너무큰 나머지 시간이 오래걸렸으며 이동하는 위치가 배열 밖인 경우가 빈번했다. 그래서 수식을 이용한 방법으로 값을 구했다. 첫 행만 리스트로 만들고 나서 자신보다 큰값을 찾은 후 대각선으로 이동하여 값을 구했다. 좌표 2개를 더한뒤 값으로 변환해야 하는데 x좌표만큼 이동뒤 찾는 y좌표만큼의 갭을 더해주어 값을 구하였다.
고생했던 점은 대각선으로 이동을 할때 조건문에 if문으로 검사해야 했는데 if else로 이동하여 같은 큰수에서 걸렸을때 오류가 났었던 예제들이 있었다. |
3. 소스코드
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
32
|
#D3 1493 수의 새로운 연산
num = 400
#인덱스 0~399까지 첫줄의 데이터를 구한다.
position_list = [0 for _ in range(num)]
for i in range(1, num-1):
position_list[i] = position_list[i-1] + i
T = int(input())
for t in range(1, T+1):
#pq값을 받아온다.
p, q = map(int ,input().split())
position = [[], []]
#반복을 돌면서 자신보다 같거나 큰값을 찾아 좌표를 계산한다.
for i in range(1, len(position_list)):
if not position[0] and p <= position_list[i]:
gab_p = position_list[i] - p
position[0] = [1 + gab_p, i - gab_p]
if not position[1] and q <= position_list[i]:
gab_q = position_list[i] - q
position[1] = [1 + gab_q, i - gab_q]
if position[0] and position[1]:
break
#계산된 자표를 더한다.
y = position[0][0] + position[1][0]
x = position[0][1] + position[1][1]
add_num = 0
#찾는 위치의 갭만큼 계산한다.
for i in range(y-1):
add_num += x + i
#계산한 데이터를 합하여 출력
print('#{} {}'.format(t, position_list[x] + add_num))
|
'코딩테스트 > SWExpertAcademy' 카테고리의 다른 글
농작물 수확하기 Python(SW Expert Academy) (0) | 2020.03.22 |
---|---|
상호의 배틀필드 Python(SW Expert Academy) (0) | 2020.03.21 |
암호생성기 Python(SW Expert Academy) (0) | 2020.03.19 |
GNS Python(SW Expert Academy) (0) | 2020.03.18 |
Magnetic Python(SW Expert Academy) (0) | 2020.03.17 |
댓글