✅ 문제

아래와 같은 2차원 배열을 왼쪽으로 90도 회전하여 출력하시오.
✅ 코드
public class Main {
public static void main(String[] args) {
int[][] num = new int[5][5];
int count = 1;
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
num[i][j] = count++;
}
}
// 원본배열 출력
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
System.out.print(num[i][j] + "\t");
}
System.out.println();
}
System.out.println();
// 90도 반시계 방향으로 회전하여 출력
for (int i = 0; i < num.length; i++) {
for (int j = 0; j < num.length; j++) {
System.out.print(num[j][4 - i] + "\t"); // 역순으로 출력
}
System.out.println();
}
}
}
✅ 추론 과정
1. 원본배열 출력
비교를 위해서 원본 배열을 출력하는 코드를 먼저 작성해 주었다. 25칸짜리 배열을 선언해주고 count 변수를 선언해서 1로 초기화 시켜준 뒤, for문을 돌리며 count를 1씩 증가시키며 배열에 집어 넣어 주었다. 이제 다시 for문을 돌려서 배열 요소들을 출력해주어야 한다. "\t"을 사용해주면 양 옆에 탭키만큼 간격을 넣어서 출력할 수 있다.
2. 반시계방향으로 90도 회전한 배열 출력
주어진 배열을 90도 반시계 방향으로 회전시키기 위해서는 배열의 행과 열을 서로 바꾸고, 각 행에 대해서 열의 순서를 역순으로 출력해야 된다.
<배열 인덱스 읽는 법>

<시계방향으로 배열 회전시 인덱스의 변화>

초보자들은 배열을 90도 반시계 방향으로 회전시키기 위해서는 왜 '배열의 행과 열을 서로 바꾸고, 각 행에 대해서 열의 순서를 역순으로 출력해야 되는지' 바로 결론에 도달하기 어렵기 때문에 내가 추천하는 방법이 따로 있다.
무조건 배열 안에서 1부터 10을 찾아보자. 그래서 1부터 10까지
그래서 이들의 배열 인덱스를 순서대로 적어 보자.
| 5 [0][0] |
10 [0][1] |
15 [0][2] |
20 [0][3] |
25 [0][4] |
| 4 [1][0] |
9 [1][1] |
14 [1][2] |
19 [1][3] |
24 [1][4] |
| 3 [2][0] |
8 [2][1] |
13 [2][2] |
18 [2][3] |
23 [2][4] |
| 2 [3][0] |
7 [3][1] |
12 [3][2] |
17 [3][3] |
22 [3][4] |
| 1 [4][0] |
6 [4][1] |
11 [4][2] |
16 [4][3] |
21 [4][4] |
그럼 이런 숫자가 나온다.
[4][0] => [3][0] => [2][0] => [1][0] => [0][0]
[4][1] => [3][1] => [2][1] => [1][1] => [0][1]
[4][2] => [3][2] => [2][2] => [1][2] => [0][2]
일단 한 줄 안에서 행 인덱스는 4,3,2,1,0 으로 변하는데 열 인덱스는 그대로 0이다
그렇다면 바깥 포문 i를 열 인덱스로 집어넣어주고, 안쪽 포문의 j를 행 인덱스로 넣어주어야 한다.
즉 배열의 행과 열을 서로 바꾸어 출력해주어야 한다는 말이다. = 출력문이 [j][i]로 나와야 한다.
근데 단순히 행과 열의 위치만 바꿔서 [j][i]로 출력해주면
| 1 | 6 | 11 | 16 | 21 |
| 2 | 7 | 12 | 17 | 22 |
| 3 | 8 | 13 | 18 | 23 |
| 4 | 9 | 14 | 19 | 24 |
| 5 | 10 | 15 | 20 | 25 |
이런 모양으로 출력이 된다. 이 모양은 우리가 출력하려던 것이 아니다.
여기서 각 행에 대해서 열의 순서를 역순으로 출력해야 된다는 것도 고려해야 한다.
12345
순서가 아니라 반대로
54321
로 들어가야 한다.
그렇다면 행을 가리키는 j는 그대로 놔두고 열인 i에 뭔가 수정을 해 주어야 한다는 뜻이 된다.
[4][0] => [3][0] => [2][0] => [1][0] => [0][0]
[4][1] => [3][1] => [2][1] => [1][1] => [0][1]
[4][2] => [3][2] => [2][2] => [1][2] => [0][2]
열의 인덱스는 4 3 2 1 0으로 변한다.
| j | 0 | 0 | 0 | 0 | 0 |
| i | 0 | 1 | 2 | 3 | 4 |
| 도출해야하는 값 | 4 | 3 | 2 | 1 | 0 |
| 4-0=4 | 4-1=3 | 4-2=2 | 4-3=1 | 4-4=0 |
즉 한 줄 안에서 열 인덱스는 4-i가 된다.
회전 후의 배열에서 각 숫자는 [j][n-1-i] 위치에 오게 된다. (n은 배열의 크기)
'코딩테스트 > JavaFestival(스마트인재개발원)' 카테고리의 다른 글
| [자바페스티벌] 25번 - 숫자 입력 받아 대시의 개수 출력하는 프로그램(대시문자 '_') (0) | 2024.03.28 |
|---|---|
| [자바페스티벌] 24번 - N과 X를 입력 받아 X보다 작은 수만 출력 (0) | 2024.03.28 |
| [자바페스티벌] 22번 - 공백 포함 별찍기 (1) | 2024.03.27 |
| [자바페스티벌] 21번 - 1차원 배열에서 두 개의 숫자를 뽑아 거리 비교하기 (0) | 2024.03.27 |
| [자바페스티벌] 20번 - 10진수 정수를 입력받아 2진수로 변환해서 출력하기 (0) | 2024.03.26 |