모래시계 배열 예제 (정중앙부터 채우기)
★프로그래밍/Ruby :: 2015. 9. 15. 19:49프로그래밍 예제로 배열을 맨 위와 맨 아래는 꽉꽉 채우고 가운데로 갈수록 양 끝을 비워놓은 모래시계 모양으로 뿌리는 예제가 있습니다.
정보처리기사와 정보처리산업기사 실기 알고리즘에도 실제로 출제된 바 있습니다.
(정보처리기능사 실기에서도 출제됐는지는 잘 모르겠습니다만...)
흔히 맨 위에서부터 1, 2, 3, 4, 5... 이런 식으로 대입하는 예제가 흔하지만
여기서는 정중앙에 1을 대입하고 그 자리를 중심으로 점점 값을 1씩 크게 해서 위 아래 위 위 아래 EXID 노래와는 상관없습니다. --; 이런 식으로 대입하는 식으로 구현했습니다.
즉, 7*7 배열에서는 다음과 같이 됩니다.
18 | 19 | 20 | 21 | 22 | 23 | 24 |
0 | 8 | 9 | 10 | 11 | 12 | 0 |
0 | 0 | 2 | 3 | 4 | 0 | 0 |
0 | 0 | 0 | 1 | 0 | 0 | 0 |
0 | 0 | 7 | 6 | 5 | 0 | 0 |
0 | 17 | 16 | 15 | 14 | 13 | 0 |
31 | 30 | 29 | 28 | 27 | 26 | 25 |
아래 예제는 이를 19*19 배열에서 구현한 예제입니다.
# 모래시계 모양으로 값 채워넣기 예제 # # 규칙 # ㉠ 정중앙에는 1을 대입합니다. # ㉡ 정중앙 줄 위의 세 자리는 왼쪽부터 2, 3, 4 순으로 대입합니다. # ㉢ 정중앙 줄 아래의 세 자리는 반대로 오른쪽부터 5, 6, 7 순으로 대입합니다. # ㉣ ㉡의 윗줄 다섯 자리는 왼쪽부터 8, 9, 10, 11, 12 순으로 대입합니다. # ㉤ ㉢의 아랫줄 다섯 자리는 오른쪽부터 13, 14, 15, 16, 17 순입니다. # ㉥ 이런 식으로 모든 줄을 채웁니다. # # 정중앙의 윗줄을 먼저 채웁니다. # 한 줄씩 채우며, 정중앙에서 멀어질수록 값이 커집니다. # 정중앙에서 위쪽은 오른쪽으로 갈수록 커집니다. # 정중앙에서 아래쪽은 왼쪽으로 갈수록 커집니다. # 채워지지 않는 자리는 무시됩니다. arr_size = 19 # 배열 가로세로 크기 설정 (정사각형, 홀수) # 배열과 정중앙 위치를 미리 선언해 둡니다. arr = Array.new(arr_size) { Array.new(arr_size, 0) } arr_center = (arr_size - 1) / 2 for i in 0..(arr_size - 1) # 순차적으로 값을 채워넣을 자리에 미리 -1을 대입합니다. # 맨 첫줄과 맨 끝줄은 줄 전체를 꽉 채우고, # 가운데로 갈수록 그에 비례하여 양 끝을 비워 놓습니다. # 정중앙 줄은 정중앙의 단 1곳만 -1을 대입합니다. # 이렇게 하면 -1이 채워진 자리는 모래시계 모양이 됩니다. jj = (i - arr_center).abs for j in (arr_center - jj)..(arr_center + jj) arr[i][j] = -1 end end arr[arr_center][arr_center] = 1 # 정중앙에 미리 1을 대입합니다. c_line = arr_center # 정중앙을 기준으로 값을 뿌릴 줄 설정. c_move = 1 # 이동될 줄 수 설정. 처음엔 정중앙에서 1줄 내립니다. c_value = 2 # 1 다음 채워넣을 값인 2부터 시작합니다. while c_move < arr_size # 이동될 줄 수가 배열 가로세로 크기와 같아질 때는 전부 채워집니다. # 따라서 이동될 줄 수와 배열 크기가 같아지면 루프에서 나갑니다. if c_move.even? # 이동될 줄 수가 짝수면 내리고 오른쪽부터 훑습니다. c_line += c_move c_pos = arr_size - 1 else # 이동될 줄 수가 홀수면 올리고 왼쪽부터 훑습니다. c_line -= c_move c_pos = 0 end while (c_move.even? && c_pos >= 0) || (!c_move.even? && c_pos < arr_size) # 짝수일 때는 왼쪽 끝에 도달할 때까지 반복하고, # 홀수일 때는 오른쪽 끝에 도달할 때까지 반복합니다. if arr[c_line][c_pos] == -1 # 앞에서 모래시계 모양으로 -1을 대입한 곳을 만날 경우 # 그 자리에 값을 1씩 늘려서 순차적으로 대입합니다. arr[c_line][c_pos] = c_value c_value += 1 end # 짝수면 왼쪽으로, 홀수면 오른쪽으로 훑어 나갑니다. c_move.even? ? c_pos -= 1 : c_pos += 1 end # 이동될 줄 수를 하나씩 늘입니다. c_move += 1 end for i in 0..(arr_size - 1) for j in 0..(arr_size - 1) # 이제 모래시계 배열을 출력합니다. # 일정한 폭으로 가지런히 표시되도록 하기 위해 서식을 지정합니다. print sprintf(" %3d", arr[i][j]) # 공백 + 3바이트 폭 end puts # 개행 end
아래는 이 코드를 실행한 스크린샷입니다.
유용하게 활용하시기 바랍니다.