coding test

[C, Python] 2차원 배열 정렬

잔망루피 2021. 2. 25. 11:52

by SW academy

 

 

😉 나의 풀이

 

def sel_min():
  _min=0
  minX, minY=0, 0

  _min=arr[0][0]
  for i in range(5):
    for j in range(5):
      if _min > arr[i][j]:
        _min=arr[i][j]
        minX, minY=i, j
  arr[minX][minY]=26
  return _min

arr=[[9, 20, 2, 18, 11], 
     [19, 1, 25, 3, 21], 
     [8, 24, 10, 17, 7], 
     [15, 4, 16, 5, 6],
     [12, 13, 22, 23, 14]]

sorted_arr=[[0]*5 for _ in range(5)]
cur_min=-1
newX, newY=0,0

dx=[1, 0, -1, 0]
dy=[0, 1, 0, -1]
dir_stat=0

for i in range(25):
  cur_min=sel_min()
  X=newX
  Y=newY
  sorted_arr[Y][X]=cur_min

  newX=X+dx[dir_stat]
  newY=Y+dy[dir_stat]

  if newY > 4 or newX > 4 or sorted_arr[newY][newX] != 0 :
    dir_stat=(dir_stat+1)%4
    newX=X+dx[dir_stat]
    newY=Y+dy[dir_stat]

for i in range(5):
  for j in range(5):
    print(sorted_arr[i][j], end=" ")
  print("\n")


 

함수 sel_min에서 2차원 배열 arr에서 최소 값을 찾는다. _min=최소 값, minX와 minY는 _min의 인덱스.

배열 최소값을 26으로 바꿔서 다시 함수 sel_min을 호출할 때 다음 최소 값을 찾을 수 있게 함.

sorted_arr에 달팽이 모양으로 정렬시킨다.

우하좌상 순으로 순회.

newX와 newY로 최소값을 삽입할 위치를 찾는다.

sorted_arr에 0이 아닌 값이 있거나 좌표 newY, newX가 4보다 크면 값을 조정한다.

sorted_arr[newY][newX] != 0에서 인덱스 에러가 떠서 newY랑 newX 뒤에 확인하게 했다.

(dir_stat+1)%4로 방향을 바꾼다. 다음 방향으로 넘어가야하니까 +1하고 방향은 4가지 중 하나다.

 

 

풀이

 

// by SW academy
#include<stdio.h>

int sel_min(int ary[][5]) {
	int min = 0;
	int minX = 0, minY = 0;

	min = ary[0][0];
	for(int i=0; i<5; i++)
		for(int j=0; j<5; j++)
			if (min > ary[i][j]) {
				min = ary[i][j];
				minX = i; minY = j;
			}
	ary[minX][minY] = 26;		// 가장 작은 값을 26으로 바꿔둠
	return min;
}

void main() {
	int ary[][5] = {
		{9, 20, 2, 18, 11},
		{19, 1, 25, 3, 21},
		{8, 24, 10, 17, 7},
		{15, 4, 16, 5, 6},
		{12, 13, 22, 23, 14}
	};

	int sorted_ary[5][5] = { 0 };
	int cur_min = -1;
	int X, Y;
	int newX = 0, newY = 0;

	int dx[] = { 1, 0, -1, 0 };		// 상하좌우
	int dy[] = { 0, 1, 0, -1 };
	int dir_stat = 0;

	for (int i = 0; i < 25; i++) {
		cur_min = sel_min(ary);
		X = newX;
		Y = newY;
		sorted_ary[Y][X] = cur_min;

		newX = X + dx[dir_stat];
		newY = Y + dy[dir_stat];

		if (sorted_ary[newY][newX] != 0 || newY > 4 || newX > 4) {
			dir_stat = (dir_stat + 1) % 4;
			newX = X + dx[dir_stat];
			newY = Y + dy[dir_stat];
		}
	}

	for (int i = 0; i < 5; i++) {
		for (int j = 0; j < 5; j++)
			printf("%3d", sorted_ary[i][j]);
		printf("\n");
	}
}

 

 

 

 

 

 

반응형

'coding test' 카테고리의 다른 글

[C] 패턴 매칭 해결하기  (0) 2021.03.04
[C] Ladder  (0) 2021.02.25
[파이썬, C] 절대값의 합 구하기  (0) 2021.02.23
[C] Baby-Gin Game  (0) 2021.02.16
[C] 거스름돈 줄이기  (0) 2021.02.16