ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소용돌이
    알고리즘 : Algorithm 2020. 8. 12. 21:30

    문제 출처 : https://www.acmicpc.net/problem/1022

     

    크기가 무한인 정사각형 모눈종이가 있다. 모눈종이의 각 정사각형은 행과 열의 쌍으로 표현할 수 있다.

    이 모눈종이 전체를 양의 정수의 소용돌이 모양으로 채울 것이다.

    일단 숫자 1을 0행 0열에 쓴다.

    그러고 나서 0행 1열에 숫자 2를 쓴다.

    거기서부터 소용돌이는 반시계 방향으로 시작된다. 다음 숫자는 다음과 같이 채우면 된다.

    위와 같은 이미지처럼 숫자를 채운다고 볼 수 있다.

    가로 좌표를 X, 세로 좌표를 Y 라 했을 때

    x, y 값이 주어 진다면 해당하는 값이 출력되는 함수를 만들어 보기로 하자!

    예를 들어 x=4, y=-2 라고 하면, 값은 55 가 출력되어야 한다.

    • 모눈종이 숫자의 패턴을 알아보자!

     

    • 사각형 넓이 구하는 x^2 과 같은 값을 발견할 수 있다.
    1*1 = 1, 3*3 = 9, 5*5 = 25

     

     

    • 간단한 함수를 만들자면
    function area(x, y) {
    	return (x*2+1) * (x*2+1);
    }
    area(0,0) // 1
    area(1,1) // 9
    area(2,2) // 25

     

    • x 값이 y 값보다 작거나 같은 녀석 함수를 구해 보자.

    function area(x, y) {
    	const m = Math.max(Math.abs(x), Math.abs(y)) 
    	// x, y 값중 절대값의 최대값을 구한다. 그래야, 7, 25, 49.. 값이 나와야 하기 때문이다.
    	const m2 = (m*2+1) * (m*2+1)
    	// 해당 줄에 최대값을 구한다. 
    	return m2 + x - y
    	// x 값이 작아 질 수록 출력값도 작아지게 식을 추론 한다.
    }
    area(2,2) // 25
    area(1,2) // 24
    area(0,2) // 23
    area(-1,2) // 22
    area(-2,2) // 21

     

    • x, y 값 모두 - (마이너스) 일 때도 한번 만들어 보자.

    function area(x, y) {
      const m = Math.max(Math.abs(x), Math.abs(y)) 
      const m2 = (m*2+1) * (m*2+1)
      if(m == y) {
      	return m2 + x - y
      	// 빨간줄에 해당함.
      } else if(m == -y){
      	return m2 - 4*m + y - x
      	// -4*m : 9-> 5, 25->17 형태를 본다면, -4*m 값을 추론할수 있다.
      	// 파란줄에 해당함. 빨간줄과 반대로 x 값이 커지면 출력값은 작아진다는 것을 추론 할 수 있다.
      }
    }

     

     

     

    • 마지막으로 모눈종이의 왼쪽과 오른쪽을 구해보자

    function area(x, y) {
      const m = Math.max(Math.abs(x), Math.abs(y)) 
      const m2 = (m*2+1) * (m*2+1)
      if(m == y) {
      	return m2 + x - y
      	// 그림의 아래쪽 
      } else if(m == -y){
      	return m2 - 4*m + y - x
      	// 그림의 윗쪽
      } else if(m == x ) {
      	return m2 - 6*m -x - y
      	// 그림의 오른쪽 에 해당한다.
      } else {
      	return m2 - 4*m - x + y
      	// 그림의 왼쪽에 해당한다.
      }
    }
Designed by Tistory.