Juwan Park :: 모래시계 배열 예제 (정중앙부터 채우기)

모래시계 배열 예제 (정중앙부터 채우기)

★프로그래밍/Ruby :: 2015. 9. 15. 19:49

프로그래밍 예제로 배열을 맨 위와 맨 아래는 꽉꽉 채우고 가운데로 갈수록 양 끝을 비워놓은 모래시계 모양으로 뿌리는 예제가 있습니다.

정보처리기사와 정보처리산업기사 실기 알고리즘에도 실제로 출제된 바 있습니다.
(정보처리기능사 실기에서도 출제됐는지는 잘 모르겠습니다만...)

흔히 맨 위에서부터 1, 2, 3, 4, 5... 이런 식으로 대입하는 예제가 흔하지만
여기서는 정중앙에 1을 대입하고 그 자리를 중심으로 점점 값을 1씩 크게 해서 위 아래 위 위 아래 EXID 노래와는 상관없습니다. --; 이런 식으로 대입하는 식으로 구현했습니다.
즉, 7*7 배열에서는 다음과 같이 됩니다.

18192021222324
0891011120
0023400
0001000
0076500
017161514130
31302928272625


아래 예제는 이를 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

아래는 이 코드를 실행한 스크린샷입니다.

유용하게 활용하시기 바랍니다.

Today    Yday    Tot
Juwan Park
Juwan Park's blog is powered by Daum and .
Contemporary Blue for .
Designed by Juwan Park. Creative Commons License
▲ TOP