일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- go 캐릭터
- go air
- go clean architecture
- air 환경변수
- 골랑 고퍼
- go 마스코트
- 좀비고루틴
- go 패닉
- gin recovery
- 신입개발자
- go 대기그룹
- 개발자
- go recover
- go 맥 air 환경변수
- go
- golang gopher
- gin logger
- gopath 환경변수
- go air 환경변수
- clean architecture middleware
- go 맥 air
- 고루틴 채널
- go channel
- git
- go 맥
- go디자인패턴
- go 환경변수
- go panic
- gin middleware
- go middleware
- Today
- Total
뽀미의 개발노트
sw 1961. 숫자 배열 회전 (자바) 본문
[문제]
N x N 행렬이 주어질 때,
시계 방향으로 90도, 180도, 270도 회전한 모양을 출력하라.
[제약 사항]
N은 3 이상 7 이하이다.
[입력]
가장 첫 줄에는 테스트 케이스의 개수 T가 주어지고, 그 아래로 각 테스트 케이스가 주어진다.
각 테스트 케이스의 첫 번째 줄에 N이 주어지고,
다음 N 줄에는 N x N 행렬이 주어진다.
[출력]
출력의 첫 줄은 '#t'로 시작하고,
다음 N줄에 걸쳐서 90도, 180도, 270도 회전한 모양을 출력한다.
입력과는 달리 출력에서는 회전한 모양 사이에만 공백이 존재함에 유의하라.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
[문제 해결 과정]
나는 2차원 배열로 할 거야!!! 가장 첫 줄에서 테스트 케이스의 개수 T를 읽어 내고, 그 밑에 있는 숫자 N 을 읽어서 int[N][N] 짜리 2차원 배열을 만들자!! 그리고 그 밑으로 주어진 정사각형 배열들의 숫자를 하나씩 떼어서 예를 들어
[0][0] = 1, [0][1] = 2, [0][2] = 3
[1][0] = 4, [1][1] = 5, [1][2] = 6
[2][0] = 7, [2][1] = 8, [2][2] = 9
이런 식으로 이차원 배열에 넣기!! 그 다음에 걔를 90도 돌린거는
[0][0] = 7, [0][1] = 4, [0][2] = 1
[1][0] = 8, [1][1] = 5, [1][2] = 2
[2][0] = 9, [2][1] = 6, [2][2] = 3
이건데 정리해보면
90도[0][0] = 처음[N][0], 90도[0][1] = 처음[N-1][0], 90도[0][2] = 처음[N-2][0] …
90도[1][0] = 처음[N][1], 90도[1][1] = 처음[N-1][1], 90도[0][2] = 처음[N-2][1] …
.
.
.
90도[N-1][0] = 처음[N][N-1] 이런식으로 90도 돌린 2차원 배열을 새로 만들어준다!!
그리고 걔를 한번 더 돌려서 180도 배열, 한번 더 돌려서 270도 배열을 만든다!!
그렇게 2차원 배열 총 3개를 만든뒤, 출력할 때는 또 새로운 2차원 배열을 만든다. 근데 그 배열은 정사각형 2차원이 아니고 직사각형 이차원이다!! 열은 3개고 행이 N개인 2차원 배열이다. 90도 회전 배열을 그 배열의 [0][0],[1][0],[2][0]번째에 문자열로 합쳐서 집어넣고 180도 회전 배열은 그 배열의 [0][1],[1][1],[2][1]번째에 넣는 식으로 배열을 채운뒤 한줄씩 출력하면 된다!!!
테스트 케이스 T를 읽어내고 그만큼 반복
N을 읽어내고 [N][N]짜리 배열을 만들어서 그 다음 줄부터 입력되는 숫자를 하나씩 읽어들여 반복문 돌려서 안에다가 집어넣는다.
90도[N][N] 짜리 배열을 만들어서 반복문 돌리며 숫자를 집어넣는다. 행과 열의 문자와 순서를 전부 뒤집어야 한다. 180도, 270도 배열도 마찬가지.
그렇게 만들어진 2차원 배열 세개에서 각각의 배열에서 한줄씩을 문자화해서 더한다.
새로운 직사각형 2차원 배열을 만든다. 열은 3개이고 행은 N개라서 [N][3] 이렇게 만들면됨!!!
직사각형 배열에 한 열씩 90도배열, 180도 배열, 270도 배열에서 한줄씩 문자화한 숫자조합을 집어넣는다!!!
1. 테스트 케이스 갯수 T 입력받고 그만큼 반복
2. N 입력받고 2차원 배열 5개 만들기.
3. 첫번째 배열 : 아래에 입력될 숫자 받아들일 배열
4. 90도 회전 배열 : 받아들인 배열의 행과 열을 바꾸고 반복문 안에서 행 순서만 거꾸로 가면됨
5. 똑같은 방식으로 한번더 회전해서 180도 배열, 한번더 회전해서 270도 배열 만들기
6. 출력 배열의 0번째 열 : 90도 배열의 숫자를 한줄씩 이어붙여 (Integer.toString()이용) 출력 배열에 한줄씩 넣기
7. 똑같은 방법으로 1번째 열에는 180도 배열, 2번째 열에는 270도 배열을 넣어주기
8. 테스트 케이스 번호 출력하고, 출력 배열을 프린트 해주면 끝!!!
문제 해석 39분 걸림!!! 젠장
[문제 풀다 틀린 이유]
자꾸 N을 3이라고 고정하고 풀어서 틀림!!
마지막에 출력을 위한 2차원 배열에서는 각각의 배열들의 한줄한줄 숫자를 이어붙여서 넣어야되는데
그냥 더하면 숫자가 계산 되기 때문에 Integer.toString()으로 더해줘야함
근데 그때 숫자가 N값에 따라서 바뀌어야되서 또 for문 써야됨!!!!
[처음으로 패스한 코드]
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
// 테스트 케이스 갯수
for(int i = 0; i < T; i++) {
int N = sc.nextInt();
int[][] cube = new int[N][N];
int[][] degree_90 = new int[N][N];
int[][] degree_180 = new int[N][N];
int[][] degree_270 = new int[N][N];
// 주어진 것과 돌릴 것들을 담을 2차원 배열 만들기
String[][] print = new String[N][3];
// 출력을 위한 마지막 이차원 배열. 행은 여러개 열은 세개임!!
for(int row = 0 ; row < N ; row++) {
// row번째 행
for(int column = 0 ; column < N ; column++) {
cube[row][column] = sc.nextInt();
// 주어진 숫자들 2차원 배열에 넣기
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_90[row][column] = cube[N-column-1][row];
// 90도 회전하면?
// 행과 열이 바뀌고 row는 숫자가 거꾸로 감소
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_180[row][column] = degree_90[N-column-1][row];
// 한번더 회전해서 180도 배열에 넣기
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_270[row][column] = degree_180[N-column-1][row];
// 한번더 회전해서 270도 배열에 넣기
}
}
for(int row = 0 ; row < N ; row++) {
print[row][0] = "";
for(int column = 0 ; column < N ; column++) {
print[row][0] = print[row][0] + Integer.toString(degree_90[row][column]);
// 90도 배열의 숫자를 한줄씩 이어붙여 출력 배열의 0번째 열에 집어넣기
}
}
for(int row = 0 ; row < N ; row++) {
print[row][1] = "";
for(int column = 0 ; column < N ; column++) {
print[row][1] = print[row][1] + Integer.toString(degree_180[row][column]);
// 180도 배열의 숫자를 한줄씩 이어붙여 출력 배열의 1번째 열에 집어넣기
}
}
for(int row = 0 ; row < N ; row++) {
print[row][2] = "";
for(int column = 0 ; column < N ; column++) {
print[row][2] = print[row][2] + Integer.toString(degree_270[row][column]);
// 270도 배열의 숫자를 한줄씩 이어붙여 출력 배열의 2번째 열에 집어넣기
}
}
System.out.printf("#%d\n",i+1);
// 몇번째 테스트 케이스인지 출력
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < 3 ; column++) {
System.out.printf("%s ", print[row][column]);
// 출력 배열 프린트
}
System.out.println("");
}
}
}
}
[문제 풀고 난 후]
아 근데 for문이 너무 많이 쓰이는데??
테스트 케이스 하나당 2차원 배열도 5개씩 만들고..
for문을 테스트 케이스때문에 어쩔수 없이 반복하는거 빼고 그 안에서만 총 8번 썼음...
for문을 좀 줄여보자!!!
[내가 몰랐던 충격적인 사실]
1. 출력배열 따위는 필요없다!
그냥 각각의 배열의 한줄씩을 띄어쓰기 이어붙여서 출력만 하면 될뿐...!
이걸로 하니까 처음에 배열 4개만 만들면 되고
for문도 8번에서 5번으로 줄었음!!!
[출력 배열(print[N][3]) 없애고 푼 코드]
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
// 테스트 케이스 갯수
for(int i = 0; i < T; i++) {
int N = sc.nextInt();
int[][] cube = new int[N][N];
int[][] degree_90 = new int[N][N];
int[][] degree_180 = new int[N][N];
int[][] degree_270 = new int[N][N];
// 주어진 것과 돌릴 것들을 담을 2차원 배열 만들기 (다 정사각형 배열이고 숫자 들어감)
for(int row = 0 ; row < N ; row++) {
// row번째 행
for(int column = 0 ; column < N ; column++) {
cube[row][column] = sc.nextInt();
// 주어진 숫자들 2차원 배열에 넣기
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_90[row][column] = cube[N-column-1][row];
// 90도 회전하면?
// 행과 열이 바뀌고 row는 숫자가 거꾸로 감소
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_180[row][column] = degree_90[N-column-1][row];
// 한번더 회전해서 180도 배열에 넣기
}
}
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
degree_270[row][column] = degree_180[N-column-1][row];
// 한번더 회전해서 270도 배열에 넣기
}
}
System.out.printf("#%d\n",i+1);
// 몇번째 테스트 케이스인지 출력
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_90[row][column]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_180[row][column]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_270[row][column]);
}
System.out.println();
}
}
}
}
2. 배열을 회전시키는 rotate라는 함수가 있었다...! -> 가 아니라
그냥 그 사람이 반복되는 함수를 따로 빼서 Rotation이라는 함수로 만든 거였음..
[회전시키는 걸 함수로 따로 빼서 만든 코드]
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
// 테스트 케이스 갯수
for(int i = 0; i < T; i++) {
int N = sc.nextInt();
int[][] cube = new int[N][N];
// 주어진 것을 담을 2차원 배열 만들기 (정사각형 배열이고 숫자 들어감)
for(int row = 0 ; row < N ; row++) {
// row번째 행
for(int column = 0 ; column < N ; column++) {
cube[row][column] = sc.nextInt();
// 주어진 숫자들 2차원 배열에 넣기
}
}
int[][] degree_90 = Rotation(cube);
int[][] degree_180 = Rotation(degree_90);
int[][] degree_270 = Rotation(degree_180);
System.out.printf("#%d\n",i+1);
// 몇번째 테스트 케이스인지 출력
for(int row = 0 ; row < N ; row++) {
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_90[row][column]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_180[row][column]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(degree_270[row][column]);
}
System.out.println();
}
}
}
private static int[][] Rotation(int[][] cube) {
int[][] rotated_cube = new int[cube.length][cube.length];
for(int row = 0 ; row < cube.length ; row++) {
for(int column = 0 ; column < cube.length ; column++) {
rotated_cube[row][column] = cube[cube.length-column-1][row];
// 90도 회전하면?
// 행과 열이 바뀌고 row는 숫자가 거꾸로 감소
}
}
return rotated_cube;
}
}
<참고한 블로그>
[SW expert Academy] SWEA 1961번 숫자 배열 회전 자바(Java)
츄르사려고 코딩하는 코집사입니다. 1. [SW expert Academy] SWEA 1961번 숫자 배열 회전 자바(Java) 1) 난이도 : D2 2) 문제번호 : 1961번 3) 문제 출처 swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5Pq-O
yongku.tistory.com
3. 굳이 90도 배열, 180도 배열, 270도 배열 만들어서
담아놓지 않고 그냥 바로 출력해버리는 수가 있다...?
왜냐면 어차피 행과 열 바뀌고 행에서 순서 바꾸는건 똑같으니까
굳이 담을 필요 없고 바로 출력에 써먹어도됨!!!
[회전시킨 숫자 배열을 2차원 배열에 담지 않고 바로 출력한 코드]
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
// 테스트 케이스 갯수
for(int i = 0; i < T; i++) {
int N = sc.nextInt();
int[][] cube = new int[N][N];
// 주어진 것을 담을 2차원 배열 만들기 (정사각형 배열이고 숫자 들어감)
for(int row = 0 ; row < N ; row++) {
// row번째 행
for(int column = 0 ; column < N ; column++) {
cube[row][column] = sc.nextInt();
// 주어진 숫자들 2차원 배열에 넣기
}
}
System.out.printf("#%d\n",i+1);
// 몇번째 테스트 케이스인지 출력
for(int row = 0 ; row < N ; row++) {
// 행과 열 자리를 바꾸고, 행이 원래와 순서가 거꾸로 가면 90도 회전한 것임
// 그 규칙만 계속 적용해주면 90도 -> 180도 -> 270도 회전 배열을 담지 않고 바로 출력할 수 있음
for(int column = 0 ; column < N ; column++) {
System.out.print(cube[N-column-1][row]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(cube[N-row-1][N-column-1]);
}
System.out.print(" ");
for(int column = 0 ; column < N ; column++) {
System.out.print(cube[column][N-row-1]);
}
System.out.println();
}
}
}
}
<참고한 블로그>
[SWEA] 1961. 숫자 배열 회전
문제 N x N의 2차원 배열에서 시계 방향으로 90도, 180도, 270도로 회전하면서 숫자 출력 풀이방법 입력받은 N x N의 2차원 배열을 a[i][j], 출력해야할 N x 3의 2차원 배열을 b[i][j]라고할 때, b[i][1] = a[n-1][
dheldh77.tistory.com
가장 마지막 코드가 가장 간단하긴 하지만.. 난 이건 너무 헷갈려서 각각을 2차원 배열에 집어넣지 않고는 생각이 잘 안 된당ㅠ
[나의 깜찍한 필기]
이차원 배열에서 row랑 column이랑 뒤바꾸고 하는거 너무 헷갈렸다!! 다들 이걸 한번 보고 뚝딱뚝딱 해내는 건가?? 나만 어려운건가?? 계속 하다보면 실력이 늘겠지?? 머 암튼 열심히 해보자 화잇띵!!
'Algorithm_Test' 카테고리의 다른 글
프로그래머스. 구명보트 (자바) (0) | 2023.08.16 |
---|---|
sw 2005. 파스칼의 삼각형 (자바) (0) | 2023.08.11 |
sw 1940. 가랏! RC카! (자바) (0) | 2023.08.06 |
sw 1989. 초심자의 회문검사 (자바) (0) | 2023.08.04 |
백준 10250 ACM 호텔 (1) | 2023.03.15 |