반응형

@notepad_jj2

츄르사려고 코딩하는 코집사입니다.


1. [SW expert Academy] SWEA 1493번 수의 새로운 연산 자바(Java)

1) 난이도 : D3

 

2) 문제번호 : 1493번

 

3) 문제 출처

swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV2b-QGqADMBBASw&categoryId=AV2b-QGqADMBBASw&categoryType=CODE&problemTitle=%EC%83%88%EB%A1%9C%EC%9A%B4&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

2. 문제


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이 된다.

 

3. 제약사항

 

4. 입력

첫 번째 줄에 테스트 케이스의 수 T가 주어진다.

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

 

5. 출력

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

 

6. 풀이

- 점의 좌표를 구하는 메소드 1개와 좌표를 통해 값을 구하는 메소드 1개를 구현

7. 소스 코드

import java.util.*;

public class Solution {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt(); //테스트케이스 개수
		
		for(int tc=1;tc<=T;tc++) {
			int p = sc.nextInt();
			int q = sc.nextInt();
			
			int[] A_coordi = getcoordi(p);
			int[] B_coordi = getcoordi(q);
			
			//좌표 연산
			int[] newCoord = { A_coordi[0] + B_coordi[0], A_coordi[1] + B_coordi[1] };
			
			//계산을 한 결과 값의 좌표의 값을 answer에 저장
			int answer = getvalue(newCoord);
			
			//출력
			System.out.printf("#%d %d",tc,answer);
			
		}
	}
	
	//좌표 구하기
	public static int[] getcoordi(int value) {
		int count = 1;
		for(int i=1;;i++) {
			for(int x=1, y=i;x<=i;x++,y--) {
				if(value==count) {
					return new int[] {x,y};
				}
				count++;
			}
		}
	}
	
	//값 가져오기
	public static int getvalue(int[] coordi) {
		int count = 1;
		for(int i=1;;i++) {
			for(int x=1,y=i;x<=i;x++,y--) {
				if(x==coordi[0] && y == coordi[1]) {
					return count;
				}
				count++;
			}
		}
	}
}

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기