본문 바로가기
이론/Data Structure , Algorithm

[210601] 자바 문제 리딩, 전치 행렬

by 6161990 2021. 6. 1.

전치행렬이란?

임의의 행렬에 대해 열의 위치와 행의 위치를 바꾼 행렬

 

 

Like This!

전치행렬

 

 

공백으로 구분 주어 1(공백)2(공백)3(공백) 식으로 받은 배열 3개를 열과 행의 위치를 바꾸어

1 4 7

2 5 8

3 6 9

로 출력되게 많드는 알고리즘을 구현해보자.

 


 

복잡하게 구현한 ver.이 먼저 있다.

전치행렬 복잡ver.

8-15 행을 기준으로 수열 n개씩 3번 받고 shiftToArray로 넘긴다.

17 치환이 끝난 애들을 shiftToNewArray(int[] array1, int[] array2, int[] array3)까지 

 

21-28 shiftToArray(String inputJason) 함수에서는

11,13,15 shift() 에서 입력받은 임의의 수열을 각각 에서 받아 

22 공백으로 split()(쪼개기)해서  "1" "2" "3" 각각 하나씩 String 배열에 넣고

24-25 int형 배열 numbers[] 에 int로 parsing해서 넣는다

27 그리고 그 배열을  return 한다.

 

31 int로 치환완료된 애들을 (각각 123,456,789) 매개변수로 받는다.

32 새로운 2차원 배열을 생성하고

33-37  array1, 2, 3에서 맨 첫번째 애들 각각 1,4,7 부터 뽑아 새로운 2차원 배열 0번째부터 넣는다. 

38 그리고 그 새로운 배열 returnArray를 return한다.

 

41 출력을 위해 2차원 배열을 매개변수로하는 메소드를 만든다

42 매개변수로 넘어온(returnArray = outputArray)을 1차원 배열(변수 array)에 차례로 넣는다.

43 1차원 배열 'array'를 int형 변수 i 에 넣어 차례로 출력한다. 

46 array1이 다 출력되면 줄바꿈 한다.

 

 

뭐 이해는 어찌저찌했는데 너무 복잡하다

좀 더 간단히 만들어보자

 

 

 


 

 

개선한 버전

개선ver.

 

9 입력받기위한 스캐너를 선언한다

10-13 행갯수과 열갯수를 받는다

15 입력받은 행,열 갯수만큼 2차원 배열을 선언한다

16-17 행(line)을 기준으로 하는 for문 안에 열(row)을 기준으로하는 내부 for문을 만든다

18 입력받은 값을 열[j]을 기준으로 하는 배열에 먼저 넣는다.

21 print(2차원배열)메소드를 부른다

 

27  매개변수로 넘어온(outputArray)을 1차원 배열(변수 array)에 차례로 넣는다.

28-29 1차원 배열 'array'를 int형 변수 i 에 넣어 차례로 출력한다. 

31 array1이 다 출력되면 줄바꿈 한다.

 

 

 


 

18번 라인이 이해가 안가신다면,

전치행렬의 핵심 알고리즘이 이해가 안가신다면....

 

전치행렬의 핵심 이해

왼쪽 손글씨에서 갈색 으로 쓴 부분은 outputArray[i][j]를 그려놓은 것

오른쪽 연두색 형광펜으로 쓴 부분은 outputArray[j][i]를 그려놓은 것

 

2차원배열에서 [i]를 기준으로하냐 [j]를 기준으로 하냐에 따라서

전치행렬을 만들 수 있다.