티스토리 뷰

728x90
반응형

이번포스팅은 간단한 알고리즘 입니다.

 

정보처리기사나, 다른 알고리즘 관련된 내용을 공부하시다보면

 

특수한 형태를 Display 해라(Ex. 삼각형, 나무, Tree모양....)라는 문제가 가끔 등장합니다.

 

이번 형태는 HourGlass(모래시계) 모양 입니다.

 

저도 예전 C언어 과제를 하면서, 이걸 못만들어서 엄청 고생했던 기억이 있네요 ㅎㅎ

 

만들어 지는 과정은.

1. HourGlass 크기만큼의 Frame을 생성한다.

2. 첫번째 Row를 가득 채우로, 그 다음 Row부터 양쪽을 1씩 좁혀나간다.

3. Row를 채워야할 값이 0보다 작거나 같아지면 다시 좌우의 양쪽을 1씩 넓히면서 Fill

 

Python으로 간단하게 구현한 HourGlass 형태의 결과물 만들기입니다~

import random

class hourglass:
    def __init__(self, n):
        self.n = n
        #Hourglass 형태를 표현한 List Frame을 준비합니다.
        self.list = [[0 for i in range(self.n)] for j in range(self.n)]
        
    def make(self):
        for i in range(self.n):
            #Hourglass의 윗부분을 계산합니다.
            #좌우로 각각 1개씩 줄어들기 때문에,
            #Range를 양쪽에서 1씩 줄이면서 Fill할 Element가 0이 되기 전까지 진행합니다.
            if self.n-2*i > 0:
                for j in range(i, self.n-i):
                    self.list[i][j] = 2
            #Hourglass의 아래부분을 계산합니다.
            #이때 크기 n이 홀수, 짝수냐에 따라서 나뉘게 됩니다.
            elif self.n-2*i <= 0:                                
                #n이 홀수일 경우 Hourglass 상단의 마지막에 1개의 Element만 Fill이 됩니다.
                #그래서 그 다음에 self.n-2*i 이 0이아닌 음수가 되기 때문에
                #self.n-2*i에 1을 더해서 아래로 내려갈수록 좌우Range가 1씩 증가하게 만듭니다.
                if divmod(self.n, 2)[1]==1:
                    for j in range(i+(self.n-2*i+1)-2, self.n-i-(self.n-2*i+1)+2):                        
                        self.list[i][j] = 2
                #n이 홀수일 경우 Hourglass 상단의 마지막에 2개의 Element만 Fill이 됩니다.
                #그래서 그 다음에 self.n-2*i 이 0에서 멈추게 됩니다.
                #self.n-2*i을 활용해서 아래로 내려갈수록 좌우Range가 1씩 증가하게 만듭니다.
                else:
                    for j in range(i+(self.n-2*i)-1, self.n-i-(self.n-2*i)+1):
                        self.list[i][j] = 2
        return self.list
        
#크기가 12인 HourGlass 객체 형성
test = hourglass(12)
test.make()
Out[83]: 
[[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
 [0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0],
 [0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0],
 [0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0],
 [0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0],
 [0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 0, 0],
 [0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0],
 [0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0],
 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]]
 
#크기가 9인 HourGlass 객체 형성
test = hourglass(9)
test.make()
Out[84]: 
[[2, 2, 2, 2, 2, 2, 2, 2, 2],
 [0, 2, 2, 2, 2, 2, 2, 2, 0],
 [0, 0, 2, 2, 2, 2, 2, 0, 0],
 [0, 0, 0, 2, 2, 2, 0, 0, 0],
 [0, 0, 0, 0, 2, 0, 0, 0, 0],
 [0, 0, 0, 2, 2, 2, 0, 0, 0],
 [0, 0, 2, 2, 2, 2, 2, 0, 0],
 [0, 2, 2, 2, 2, 2, 2, 2, 0],
 [2, 2, 2, 2, 2, 2, 2, 2, 2]]
728x90
반응형

'Python 알고리즘 > ETC' 카테고리의 다른 글

Prime Number 여부 확인(단순탐색)  (0) 2021.02.28
사칙연산의 표현  (0) 2021.02.24
Genetic Algorithm  (0) 2021.02.08
작업 스케쥴링 문제  (0) 2021.02.04
작업 선택 문제  (0) 2021.02.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함