Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
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
관리 메뉴

으하하 공부일기

[SWEA] - 1493. 수의 새로운 연산 (D3) 본문

SWEA/D3

[SWEA] - 1493. 수의 새로운 연산 (D3)

0으하하0 2022. 5. 6. 20:56

[문제]

2차원 평면 제 1사분면 위의 격자점 (x,y)에 위 그림과 같이 대각선 순서로 점에 수를 붙인다.
점 (x,y)에 할당된 수는 #(x,y)로 나타낸다.
예를 들어 #(1,1) = 1, #(2,1)=3, #(2,2) = 5, #(4,4) = 25이다.

반대로 수 p가 할당된 점을 &(p)로 나타낸다.
예를 들어 &(1) = (1,1), &(3) = (2,1), &(5) = (2,2), &(25) = (4,4)이다.

두 점에 대해서 덧셈을 정의한다. 점 (x,y)와 점 (z,w)를 더하면 점 (x+z, y+w)가 된다.
즉, (x,y) + (z,w) = (x+z, y+w)로 정의한다.

우리가 해야 할 일은 수와 수에 대한 새로운 연산 ★를 구현하는 것으로, p★q는 #(&(p)+&(q))으로 나타난다.
예를 들어, &(1)=(1,1), &(5) = (2,2)이므로, 1★5 = #(&(1)+&(5)) = #((1,1)+(2,2)) = #(3,3) = 13이 된다.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 두 정수 p,q(1 ≤ p, q ≤ 10,000)가 주어진다.

[출력]
각 테스트 케이스마다 ‘#t’(t는 테스트 케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 각 테스트 케이스마다 p★q의 값을 출력한다.

문제 풀기

1493. 수의 새로운 연산

 


[풀이]

  • 점의 좌표를 구하는 &()를 수행할 메소드 and와, 좌표를 통해 값을 구하는 #()를 수행할 메소드 hash를 구현한다
import java.util.Scanner;

class Solution {
	public static void main(String[] args) throws Exception {		
		Scanner sc = new Scanner(System.in);
		
		int t = sc.nextInt();
		
		for(int tc=1; tc<=t; tc++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			
			int xy[] = and(a);
			int zw[] = and(b);
			
			int xyzw[] = {xy[0] + zw[0], xy[1] + zw[1]};
			
			int result = hash(xyzw);
			
			System.out.format("#%d %d\n", tc, result);
		}
	}
	
	public static int[] and(int a) {
		int cnt = 1;
		
		for(int i=1; ; i++) {
			for(int x=1, y=i; x<=i; x++, y--) {
				if(a==cnt)
					return new int[] {x, y};
				cnt++;
			}
		}
	}
	
	public static int hash(int[] a) {
		int cnt = 1;
		
		for(int i=1; ; i++) {
			for(int x=1, y=i; x<=i; x++, y--) {
				if(a[0] == x && a[1] == y)
					return cnt;
				cnt++;
			}
		}
	}
}