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 51    Yday 43    Tot 79,356
Juwan Park
Juwan Park's blog is powered by Daum and TISTORY.
Contemporary Blue for TISTORY.
Designed by Juwan Park. Creative Commons License
▲ TOP