Algorithm Solved - Gold 4 [Swift] 2448 별 찍기 - 11

[Swift] 2448 별 찍기 - 11

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

Example

입력

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, …) (0 ≤ k ≤ 10, k는 정수)

출력

첫째 줄부터 N번째 줄까지 별을 출력한다.

예제 입력 1

24

예제 출력 1

                       *                       
                      * *                      
                     *****                     
                    *     *                    
                   * *   * *                   
                  ***** *****                  
                 *           *                 
                * *         * *                
               *****       *****               
              *     *     *     *              
             * *   * *   * *   * *             
            ***** ***** ***** *****            
           *                       *           
          * *                     * *          
         *****                   *****         
        *     *                 *     *        
       * *   * *               * *   * *       
      ***** *****             ***** *****      
     *           *           *           *     
    * *         * *         * *         * *    
   *****       *****       *****       *****   
  *     *     *     *     *     *     *     *  
 * *   * *   * *   * *   * *   * *   * *   * *
***** ***** ***** ***** ***** ***** ***** *****

풀러가기

문제 이해

Input: 3
Output:
  *   
 * *  
*****
Input: 6
Output:
     *      
    * *     
   *****    
  *     *   
 * *   * *  
***** *****
Input: 12
Output:
           *            
          * *           
         *****          
        *     *         
       * *   * *        
      ***** *****       
     *           *      
    * *         * *     
   *****       *****    
  *     *     *     *   
 * *   * *   * *   * *  
***** ***** ***** *****

이와 같은 형태로 삼각형이 중첩되는 형태다.

코드

let input = Int(readLine()!)!

var array = [
  "  *   ",
  " * *  ",
  "***** "]

var num = 3
while num < input {
  let count = array.count

  var temp: [String] = []

  for a in array {
    temp.append(a + a)
  }

  for i in 0 ..< count {
    var str = array[i]
    str = String(repeating: " ", count: count) + str + String(repeating: " ", count: count)
    array[i] = str
  }

  array.append(contentsOf: temp)
  num *= 2
}

for s in array {
  print(s)
}

풀이

풀기까지 여러 시도와 실패가 있었다. 처음엔 String(repeating:count:) 로 한줄을 완성하고 print 하는 형태로 접근했는데, 규칙을 찾기가 쉽지 않았다. 그래서 재귀적으로 풀었으나 코드 이해가 쉽지 않았고 복잡했다. 제출 했으나 시간 초과로 실패가 되었다.

결국 메모리를 복사하는 방법으로 접근했는데 코드 이해도 쉽고 깔끔했다.

순서는 3 -> 6 -> 12 .. 순이다. 문제를 잘 읽어봤어야 했는데 ‘9’도 맞춰보느라 시간을 낭비했다.
변수 a 이런 형태는 지양하도록 해야겠다.

Image

다른 분의 멋진 코드

yoon_1318

var size: Int = Int(readLine()!)!

var beforeStar: [String] = []
var currentStar: [String] = ["  *  ", " * * ", "*****"]
var blank: String = "   "
let initNum: Int = 6

func makeStar(_ n: Int) {
  if n == size {
    for i in 0..<n/2 {
      print(blank + currentStar[i] + blank)
    }
    for i in 0..<n/2 {
      print(currentStar[i] + " " + currentStar[i])
    }
    return
  }

  beforeStar = currentStar
  currentStar = []
  for i in 0..<n/2 {
    currentStar.append(blank + beforeStar[i] + blank)
  }
  for i in 0..<n/2 {
    currentStar.append(beforeStar[i] + " " + beforeStar[i])
  }
  blank += blank
  makeStar(2*n)
}

switch size {
  case 3: print("  *  \n" + " * * \n" + "*****")
  default: makeStar(initNum)
}

잘 배웠습니다.

재귀 + 배열복사로 접근했고 이렇게 접근하는 방법은 생각도 못했다. 나의 경우 currentStart 에 공백을 주었는데 공백이 없는 부분과 blank 처리가 어려웠는데 blank 처리도 깔끔하다. 성능이나 여러면에서 배울점이 많다.

댓글남기기