Free Lines Arrow
본문 바로가기
Algorithm/프로그래머스 알고리즘

[프로그래머스] 행렬 테두리 회전하기

by skahn1215 2022. 7. 8.
728x90
반응형

문제

 

 

 

분석

  • 분석이 좀 필요한 문제 였다.
  • 2,2,5,4 가 주어 졌을때 회전 시킨다 문제를 보면 한칸씩 시계 방향으로 회전 시키면 될것 같다.

어떻게 기준을 잡을 것인가?

Point1(2,2), Point2(5,4), StartPoint(point1.x, point1.y) 로 기준을 잡는다.

 

어떻게 위치를 바꿔 나갈 것인가?

step1

오른쪽으로 이동: StartPoint y 가 point2 의 y 와 같아 질때까지 y 증가

step2

아래로 이동: StartPoint x 가 point2 의 x 와 같아 질때까지 x 증가

step3

왼쪽으로 이동: StartPoint y 가 point1 의 y 와 같아 질때까지 y 감소

step3

위로 이동: StartPoint x 가 point1 의 x 와 같아 질때까지 x 감소

 

구현

class Solution {
    
    public int map[][] = new int[100][100];
    
    public class Point {
       public int x;
       public int y;
        Point(int x, int y) {
            this.x = x-1;
            this.y = y-1;
        }
    }
    
    
    public void solve(Point p1, Point p2, int[]answer, int rotateCoount) {
       
        int preNumber;
        int x  = p1.x;
        int y  = p1.y;
        int dir = 0;
        int currentNumber = map[p1.x][p1.y];
        int min = map[p1.x][p1.y];

        while(true) {
            if (dir == 0 && (p2.y != y)) {
                ++y;
            } else if ( dir == 1 && (p2.x != x)) {                
                ++x;
            } else if (dir == 2 && (p1.y != y)) {                
                --y;
            } else if ( dir == 3 && (p1.x != x)) {                
                --x;
            }
            
            if (dir == 0 && p2.y == y) {
                dir = 1;
            } else if ( dir == 1 && p2.x == x) {
                dir = 2;
            } else if (dir == 2 && p1.y == y) {
                dir = 3;
            }
               
            
            preNumber = map[x][y];
            map[x][y] = currentNumber;
            currentNumber = preNumber;
        
            if (min > currentNumber) {
                min = currentNumber;
            }
                               
           if (dir == 3 && x == p1.x && y == p1.y) {
                break; 
           }
        }
        answer[rotateCoount] = min;
    }
    
    public void init(int rows, int columns) {
        int num = 1;
        for(int i = 0; i < rows; i++) {
          for(int j = 0; j < columns; j++) {
            map[i][j] = num++; 
          }   
        }
    }
    
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int [queries.length];    
        init(rows, columns);
        
        for(int i = 0; i < queries.length; i++ ) {
            Point orgP1 = new Point(queries[i][0], queries[i][1]);
            Point orgP2 = new Point(queries[i][2], queries[i][3]);
            Point startPoint = new Point(queries[i][0], queries[i][1]);
            solve(orgP1, orgP2, answer, i);
        }
        
        
        return answer;
    }   
}

 

 

결과

 

 

 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/77485?language=java 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

728x90
반응형

댓글