체스판식 등차수열 채우기 예제
★프로그래밍/Ruby :: 2015. 9. 17. 14:58
모래시계 배열, ㄹ자 배열에 이어 이번에는 체스판식 배열로 등차수열 채우기 예제입니다.
말 그대로 배열 값을 채우는 예제입니다.
예를 들어, 위 그림의 체스판처럼 배열을 8*8로 했다고 가정하면, 일단 위 그림의 밝은색 칸에 해당하는 자리부터 먼저 채웁니다.
우선, 왼쪽의 흑색 룩(♜)이 있는 자리는 1, 그 다음 한 칸 건너 왼쪽 흑색 비숍(♝)이 있는 자리는 2, 또 그 다음 한 칸 건너 흑색 킹(♚)이 있는 자리는 3, 또 그 다음 한 칸 건너 오른쪽 흑색 나이트(♞)가 있는 자리는 4가 들어갈 것입니다.
그런 다음 한 줄 내려서 이번에는 왼쪽에서 두 번째 칸에 있는 폰2(♟)에는 5, 폰4에는 6, 폰6에는 7, 폰8에는 8 이런 순서로 채워나가면
나중에는 맨 마지막의 오른쪽 백색 룩(♖)이 있는 자리에는 32가 들어갈 것입니다.
그 다음, 이제는 값을 채워넣지 않은 위 그림의 어두운색 칸에 해당하는 자리에 값을 마저 채웁니다.
왼쪽의 흑색 나이트가 있는 자리는 33, 그 다음 흑색 퀸(♛)이 있는 자리는 34, 그 다음 오른쪽의 흑색 비숍이 있는 자리는 35, 그 다음 오른쪽의 흑색 룩이 있는 자리는 36, ...
이렇게 계속 가다가 마지막으로 오른쪽 백색 나이트(♘)가 있는 자리에 64를 채우는 것으로 끝납니다.
아래 예제는 이 규칙에 따라 8*8 배열에 값을 채워넣는 상황을 구현한 코드입니다.
# 체스판식으로 값 채워넣기 예제 # # 규칙 # ㉠ 배열의 맨 처음 위치에는 1을 대입합니다. # ㉡ 그 오른쪽으로는 한 칸 건너뛰고 그 다음 칸에 2를 대입합니다. # ㉢ 이와 같이 한 칸씩 비워두고 3, 4 ... 순서대로 대입합니다. # ㉣ 그 다음 줄은 처음 한 칸을 비워두고 그 다음부터 첫 줄처럼 채웁니다. # ㉤ ㉣의 다음 줄은 첫 줄처럼 첫 칸부터, 그 다음 줄은 한 칸 띄우고 채웁니다. # ㉥ 이런 식으로 맨 마지막 줄을 채웁니다. # ㉦ 채우지 않고 건너뛴 나머지 칸을 그 다음 숫자부터 같은 방법으로 채웁니다. # # 즉, 4*4 배열의 경우 다음과 같은 식이 됩니다. # 1, 9, 2, 10, # 11, 3, 12, 4, # 5, 13, 6, 14, # 15, 7, 16, 8, arr_rowsize = 8 # 배열 세로 크기 설정 arr_colsize = 8 # 배열 가로 크기 설정 # 배열과 채울 숫자를 미리 선언해 둡니다. arr = Array.new(arr_rowsize) { Array.new(arr_colsize, 0) } fillnum = 1 for i in 0..(arr_rowsize - 1) # 맨 첫 칸부터 체스판식으로 값을 채웁니다. # 세로 위치(i) + 가로 위치(j) = 짝수일 경우에만 값을 채웁니다. for j in 0..(arr_colsize - 1) if (i + j).even? arr[i][j] = fillnum fillnum += 1 end end end for i in 0..(arr_rowsize - 1) # 앞에서 값이 채워지지 않은 위치에 값을 채웁니다. # 세로 위치(i) + 가로 위치(j) = 홀수일 경우에만 값을 채웁니다. for j in 0..(arr_colsize - 1) if !(i + j).even? arr[i][j] = fillnum fillnum += 1 end end end for i in 0..(arr_rowsize - 1) for j in 0..(arr_colsize - 1) # 이제 체스판식 배열을 출력합니다. # 일정한 폭으로 가지런히 표시되도록 하기 위해 서식을 지정합니다. print sprintf(" %3d", arr[i][j]) # 공백 + 3바이트 폭 end puts # 개행 end
아래는 이 코드를 실행한 스크린샷입니다.
위 코드를 응용하면 1, 33, 2, 34, 3, 35 대신 1, 64, 2, 63, 3, 62, 4, 61 ... 식으로 처음 채울 때는 순서대로 채우지만 나머지 칸을 채울 때는 역순으로 채우게끔 구현하는 것도 가능합니다.
유용하게 활용하시기 바랍니다.