[JAVA] SWEA 1493 - 수의 새로운 연산

hyng·2022년 2월 1일
0

SWEA

목록 보기
23/78

solution

2차원 평면 제 1사분면 위의 격자점 (x,y)에 위 그림과 같이 대각선 순서로 점에 수를 붙인다.
->
예시를 보면 각 행의 시작 값은
1,2,4,7... 이런식으로 증가한다.

즉 더해지는 값이 1씩 증가한다.

1+1 = 2,
2+2 = 4,
4+3 = 7

그리고 첫 행의 열을 보면
1,3,6,10... 으로 증가한다.
그리고 다음 행의 열을 보면
2,5,9,14... 으로 증가한다.

즉 첫행에서는 더해지는 수가 2,3,4...로 증가하고
두 번째 행에서는 더해지는 수가 3,4,5...로 증가한다.

각각 행에서 열에 더해지는 수가 1씩 더해지는데
각 행마다 더해지는 수의 시작 값도 1씩 증가한다.

문제에서 주어지는 p, q의 최댓값은 10000이다.
즉 할당된 수가 10000보다 작거나 같을 때까지 반복문으로
(y, x)에 할당되는 수를 구해주면 된다.
할당된 수가 10000보다 작거나 같을 때까지 구해주면
y를 141, x를 140까지 구해주면 된다.
근데 문제에서는 p, q가 주어지면
p의 위치 + q의 위치 = 새로운 위치를 구해서
새로운 위치에 할당된 수를 구해줘야 되기 때문에
p의 위치가 (141,140)이고 q의 위치가 (141,140) 이면 (282,280) 위치에 할당된 수를 구해줘야 한다.
그래서 (y, x)를 (141,140)까지가 아니라 (282,280)까지 구해주면 된다.

code

import java.util.*;

class Location{
    int y;
    int x;
    Location(int y, int x){
        this.y = y;
        this.x = x;
    }
}
class Solution
{
    
    static HashMap<String, Integer> locationMap = new HashMap<>();
    static HashMap<Integer, Location> map = new HashMap<>();

	public static void main(String args[]) throws Exception
	{
		Scanner sc = new Scanner(System.in);
        StringBuffer sb = new StringBuffer();

        
        init();
        int T = sc.nextInt();
        for(int tc=1; tc<=T; tc++){
            sb.append("#").append(tc).append(" ");
            int P = sc.nextInt();
            int Q = sc.nextInt();
            
            Location pLoc = map.get(P);
            Location qLoc = map.get(Q);

            Location newLoc = new Location(pLoc.y+qLoc.y, pLoc.x+qLoc.x);
            StringBuffer loc = new StringBuffer();
            loc.append(newLoc.y).append(",").append(newLoc.x);
            sb.append(locationMap.get(loc.toString())).append("\n");

        }
        System.out.println(sb);
	}
    
    static void init(){
        int a = 1; //각 행 시작 수
        int b = 2; //각 행 더해지는 수
        for(int i=1; i<=10000; i++){
            int c = a;
            int d = b;
            for(int j=1; j<=10000; j++){
                StringBuffer sb = new StringBuffer();
                sb.append(i).append(",").append(j);
                locationMap.put(sb.toString(),c);
                map.put(c, new Location(i,j));
                c += d++;

                if(j > 280){
                    break;
                }
                
            }
            
            
            a += i;
            b++;
            if(i > 282){
                break;
            }
        }

    }
    
}
profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글