본문 바로가기

ps

[프로그래머스] 퍼즐 조각 채우기

 

프로그래머스

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

programmers.co.kr

 

문제의 조건에 따라 정확하게 구현하는가를 판단하는 문제로 로직은 그렇게 복잡하지는 않았다. 

하지만 도형을 회전시켜 같은 도형인지를 판단하는 부분에서 애를 먹었다.

내가 접근한 방식은 두가지 방식이다.

 

1. 무식하게 회전시키는 방법

사실 코딩테스트에서 문제를 풀때는 깔끔한 코드는 필요없어서 이런 간단한 방법이 더 좋은 선택지일 수 있다고 생각한다.

 

아래의 코드는 data에 저장된 모양을 90, 180, 270, 360 회전한 결과를 따라 입력 각도에 따라 출력하는 함수이다. 순서는 각도와 상관없다.

private String getShape(boolean[][] data, int degree) {
        String result = "";
        if (degree == 0) {
            for (int r = 0; r < data.length; r++) {
                for (int c = 0; c < data[0].length; c++) {
                    result += data[r][c] ? 'o' : 'x';
                }
                result += '\n';
            }
        } else if (degree == 1) {
            for (int r = data.length - 1; r > -1; r--) {
                for (int c = data[0].length - 1; c > -1; c--) {
                    result += data[r][c] ? 'o' : 'x';
                }
                result += '\n';
            }
        } else if (degree == 2) {
            for (int c = 0; c < data[0].length; c++) {
                for (int r = data.length - 1; r > -1; r--) {
                    result += data[r][c] ? 'o' : 'x';
                }
                result += '\n';
            }
        } else {
            for (int c = data[0].length - 1; c > -1; c--) {
                for (int r = 0; r < data.length; r++) {
                    result += data[r][c] ? 'o' : 'x';
                }
                result += '\n';
            }
        }
        return result;
    }

화살표가 가르키는 점이 회전시 시작점

배열의 인덱스는 그림처럼 구성되어 있을 때

 

각도에 따라서 시작하는 인덱스를 그림에 따라서 순서에 맞게 반복문을 사용하면 도형을 출력할 수 있다는 점을 이용한 로직이지만

 

어찌보면 중복되는 코드가 많고 가독성이 좋지않아서 아쉬운 코드이다.

 

2.  공식을 이용한 회전

좌표계에서 한점을 원점을 기준으로 이동할 때 좌표를 이동하는 것을 배열에 적용한 것이다.

 

좌표에서 (A, B) 를 -90도 회전 하면 (B, -A)로 회전한다. +90도 회전하면 (-B, A)로 회전한다.

 

-90도 회전

 

하지만 좌표의 원점을 기준으로 회전하는 것은 배열 속 데이터를 회전하는 것과 차이점이 있다.

바로 배열은 음수가 없다는 것

그래서 좌표의 회전한 공간을 그대로 양수 공간인 1사분면으로 이동시킨다. 이때 이동하는 거리는 (x, y) = (0, MAX_X)이다.

 

따라서 (A, B) -90도 회전 => (B, -A) 1사분면 이동 => (B, MAX_X - A) 로 이동하게 된것이다.

 

이 원리를 적용해서 로직을 짜는 코드를 작성하면 회전에 대한 로직을 짤 수 있다.

 

주의할 점

  • 좌표에서 사용한 좌표값은 배열의 인덱스 범위와 같다.
    • MAX_X를 계산할 때 무작성 배열의 크기를 적용하면 안된다.
  • MAX_X는 회전할 때 마다 변경된다.

'ps' 카테고리의 다른 글

[프로그래머스] 고고학 최고의 발견  (0) 2023.02.16
[프로그래머스] 등대  (0) 2023.02.16
[백준] 10775 공항  (0) 2023.01.11
[백준] 1890 점프 JAVA 정답 코드  (0) 2022.06.07
[알고리즘] 이분탐색  (0) 2021.08.10