코딩테스트/SWEA

[Python, 파이썬] SWEA 1493. 수의 새로운 연산

알코딩 2024. 10. 22. 05:19

 

 

위 그림과 같이 대각선 순서로 점에 수를 붙인다.

&은 수가 주어질 때 그 위치를 찾는 연산이며, 반대로 #은 위치가 주어질 때 수를 찾는 연산이다.

 

p★q는 #(&(p)+&(q))이라 할때, 와 수에 대한 새로운 연산 ★를 구현해보는 문제.

 

 

 

[코드]


def startIndex(): # 시작 번호 배열 구하기
    
    A = [1 for i in range(400)] # 시작 번호 배열
    for i in range(1, 400):
        
        A[i] = (A[i-1]+i) # A 배열 값 채우기 

    return A
    

def And(n): # (연산 & : 번호-> 위치)
    
    for i in range(len(A)):
    
        if(A[i] > n):
            x, y = (1, i) # 대각선의 시작점
            diff = n - A[i-1] # 차이 구하기
            break

    return (1+diff, i-diff) # 좌표 return

def Hash(x, y): # (연산 # : 위치 -> 번호)
    
    index = A[x+y-2] # 위치가 해당하는 대각선의 시작 번호

    return index+(x-1) # 시작번호 + diff
    

def star(p, q): # 새로운 연산 ★
    
    x1, y1 = And(p) # p의 & 연산
    x2, y2 = And(q) # q의 & 연산

    answer = Hash(x1+x2, y1+y2) # &(p)+&(q)의 #연산

    return answer

T = int(input()) # 테스트케이스 개수 T
A = startIndex() # 대각선의 시작번호 구하기

for test_case in range(1, T+1):

    p, q = map(int, input().split()) # (p, q)

    # ★ 연산하기
    answer = star(p, q)               

    print("#%d %d" %(test_case, answer))
 

 

 

 

[문제풀이]


 

내가 집중한 건 대각선의 시작점이다.

 

 

이 대각선의 시작점은 1부터 시작해서 대각선의 길이, 즉 i를 계속해서 더해나가는 규칙이 있었다.

이를 점화식으로 만들어 대각선들의 시작점의 배열을 구한다.

A[i] = (A[i-1]+i) # A 배열 값 채우기 
 

이때 배열의 크기는 충분히 크게 해야 한다....

한 200개면 괜찮겠지 싶어서 만들었다가 자꾸 에러떴다.

그리고 이 대각선들의 시작점들을 통해 #와 & 연산을 구현했다.

 

 

& 연산

 

 

수를 받아 위치를 구하는 & 연산의 경우 위와 같은 방식으로 구한다.

숫자가 시작하는 대각선의 번호를 찾는다.

그럼 그 위치의 시작점은 (1, i+1)가 된다.

 

그 후 찾는 번호 - 시작 번호의 diff를 시작 번호에 각각 연산해주면 위치를 찾을 수 있다.

 

 

# 연산

 

index = A[x+y-2] # 위치가 해당하는 대각선의 시작 번호
 

위치를 받아 수를 연산하는 # 연산의 경우엔 대각선이 위치한 점들의 합은 동일하다는 점을 이용했다.

그럼 (x, y)의 경우엔 (x+y)-2번째 위치의 값이 대각선의 시작점의 수다.

return index+(x-1) # 시작번호 + diff
 

그럼 그 시작점 수 index에 x에 더해진 diff값을 더해 수를 찾아주면 된다.

 

이렇게 차례로 &와 # 연산을 마친 새로운 연산 ★을 통해 답을 구해주면 끝!