투로드
Coder ToLoad
투로드
전체 방문자
오늘
어제

블로그 메뉴

  • 홈
  • 알고리즘
  • CS
  • GITHUB
  • 태그
  • 분류 전체보기 (69)
    • Toy Project (0)
      • EternalSNS (0)
    • Algorithm (46)
      • BaekJoon (38)
      • Programmers (7)
      • Code Tree (1)
    • Computer Science (13)
      • JAVA (7)
      • DataBase (4)
    • Backend (7)
      • Spring (2)
      • JPA (2)
      • Django (3)
    • Mobile (2)
      • Android (2)
    • Unity (1)

인기 글

최근 글

hELLO · Designed By 정상우.
투로드

Coder ToLoad

[JAVA] 행렬 테두리 회전하기
Algorithm/Programmers

[JAVA] 행렬 테두리 회전하기

2021. 5. 3. 18:50
문제
 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

해결 방법

어려운 문제인가 했는데, 글에 적힌대로 구현하니 작동이 되었다.

그래서 구현은 문제에서 제시한 가로, 세로 크기만큼 배열을 생성한 뒤에 숫자를 입력해주고,

그림의 1, 2, 3, 4번 순서대로 회전하게끔 반복문을 통해 구현했다.

그리고 최솟값을 찾을 수 있게 min 변수를 게속 체크하면서 확인하였다.

 

1번은 y값을 증가시켜 y2와 일치하면 멈춰주고,

2번은 x값을 증가시켜 x2와 일치하면 멈춰주었다.

3번은 y값을 감소시켜 y1과 일치하면 멈춰주고,

4번은 x값을 감소시켜 x1과 일치하면 멈춰주었다. 

이런 방식으로 진행하면 한 바퀴 회전이 종료되고, 회전하면서 발견한 값 중 제일 작은 값을 반환한다.

 

코드
import java.util.*;

class Solution {
    static int[][] map;
    public int[] solution(int rows, int columns, int[][] queries) {
        map = new int[rows + 1][columns + 1];
        int num = 1;
        for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= columns; j++) {
                map[i][j] = num;
                num++;
            }
        }
        
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < queries.length; i++) {
            int min = rotation(queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
            list.add(min);
        }
        
        int[] answer = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            answer[i] = list.get(i);
        }
        
        return answer;
    }
    
    static int rotation(int x1, int y1, int x2, int y2) {
        int pre = map[x1][y1]; // 이전 값을 저장
        int tempX = x1;
        int tempY = y1;
        int min = pre; // 최솟값 저장용
        
        while (true) {
            tempY = tempY + 1; // 한 칸 우측 이동
            int temp = map[tempX][tempY]; // 현재 칸 정보
            min = Math.min(min, temp);
            map[tempX][tempY] = pre; // 앞 칸 숫자를 현재 칸에 저장
            pre = temp; // 현재 칸의 바뀌기 전 값 저장
            
            if (tempY == y2) break;
        }
        
        while (true) {
            tempX = tempX + 1; // 한 칸 아래로 이동
            int temp = map[tempX][tempY];
            min = Math.min(min, temp);
            map[tempX][tempY] = pre;
            pre = temp;
            
            if (tempX == x2) break;
        }
        
        while (true) {
            tempY = tempY - 1; // 한 칸 좌측 이동
            int temp = map[tempX][tempY];
            min = Math.min(min, temp);
            map[tempX][tempY] = pre;
            pre = temp;
            
            if (tempY == y1) break;
        }
        
        while (true) {
            tempX = tempX - 1; // 한 칸 위로 이동
            int temp = map[tempX][tempY];
            min = Math.min(min, temp);
            map[tempX][tempY] = pre;
            pre = temp;
            
            if (tempX == x1) break;
        }
        
        return min;
    }
}

'Algorithm > Programmers' 카테고리의 다른 글

[JAVA] Programmers : 등산코스 정하기  (0) 2022.09.07
[JAVA] Programmers : 배달  (0) 2022.05.02
[JAVA] Programmers : 피로도  (0) 2022.05.02
[JAVA] 광고 삽입  (0) 2021.05.01
[JAVA] 합승 택시 요금  (0) 2021.04.29
    'Algorithm/Programmers' 카테고리의 다른 글
    • [JAVA] Programmers : 배달
    • [JAVA] Programmers : 피로도
    • [JAVA] 광고 삽입
    • [JAVA] 합승 택시 요금
    투로드
    투로드
    훌륭한 프로그래머가 되어가는 과정을 담아보는 중입니다.

    티스토리툴바