/* Q1. 4x4 행렬
 
 ****
 ****
 ****
 ****
 
 */
for _ in 0...3 {
    for _ in 0...3 {
        print("*", terminator:"")
    }
    print("")
}

단일 for문으로 행렬을 만들 수도 있다!

// 단일 for문으로 할 수도 있다! 4x4니까 금방 돌지 100x100 행렬이면 이중 for문보다 속도가 빠를 것이라 함!

for i in 1...20 {
    if i%5 == 0{
        print()
    }else{
        print("*", terminator:"")
    }
}
/* Q2. 삼각형
 
 *
 **
 ***
 ****
 
 */
for i in 0...3 {
    for _ in 0...i {
        print("*", terminator:"")
    }
    print("")
}
/* Q3. 역삼각형

 ****
 ***
 **
 *

*/
for i in 0...3 {
    for _ in stride(from: 3, through: i, by: -1) {
        print("*", terminator:"")
        
    }
    print("")
}
/* Q4. 삼각형 트리

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

 */
for i in 0...3 {
    for _ in stride(from: 2, through: i, by: -1) {
        print(" ", terminator:"")
    }
    for _ in stride(from: 0, through: 2*i, by: 1) {
        print("*", terminator:"")
    }
    print("")
}
/* Q5. 역삼각형 트리
 
 *******
  *****
   ***
    *
 
 */
for i in 0...3 {
    for _ in stride(from: 1, through: i, by: 1) {
        print(" ", terminator:"")
    }
    for _ in stride(from: 6, through: 2*i, by: -1) {
        print("*", terminator:"")
    }
    print("")
}
// Q6. 다이아몬드
/*
 
    *
   ***
  *****
 *******
  *****
   ***
    *
 
 */
var m = 0

for _ in 0...1 {
if m == 0 {
    for p in 0...3 {
        for _ in stride(from: 2, through: p, by: -1) {
            print(" ", terminator:"")
        }
        for _ in stride(from: 0, through: 2*p, by: 1) {
            print("*", terminator:"")
        }
        print("")
        m = m + 1
    }
} else if m != 0 {
    for q in 0...2 {
        for _ in stride(from: 0, through: q, by: 1) {
            print(" ", terminator:"")
        }
        for _ in stride(from: 4, through: 2*q, by: -1) {
            print("*", terminator:"")
        }
        print("")
    }
    print("")
}
}

다이아몬드에서 주의해야할 점이, 현실에서는 삼각형을 2개 붙이면 다이아몬드가 되지만, 코딩에서는 동일한 삼각형을 뒤집어 저렇게 못생기게 나온다. 위에를 한 줄 줄이든 아래를 한 줄 줄이든 해야한다. 아래 그 예를 첨부함.

// 단순히 삼각형을 붙인 경우
var m = 0

for _ in 0...1 {
if m == 0 {
    for p in 0...3 {
        for _ in stride(from: 2, through: p, by: -1) {
            print(" ", terminator:"")
        }
        for _ in stride(from: 0, through: 2*p, by: 1) {
            print("*", terminator:"")
        }
        print("")
        m = m + 1
    }
} else if m != 0 {
    for q in 0...3 {
        for _ in stride(from: 1, through: q, by: 1) {
            print(" ", terminator:"")
        }
        for _ in stride(from: 6, through: 2*q, by: -1) {
            print("*", terminator:"")
        }
        print("")
    }
    print("")
}
}

/* 결과는

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

*/

 

2~3번처럼 앞에가 붙어있는 삼각형은 만들기 쉽다.

단, 주의해야할 점은 위의 for문에서처럼 바깥쪽 for문에서 줄바꿈 하고 싶을 때 같은 줄이 아닌 아랫줄에 print(“”)만 하면 된다.

print(“\m”) 하면 2줄 아래로 간다. 주의!!! (1줄 1코드 원칙이라서 그럼!!)

4~5번에서 내가 처음 잘못 생각했던 방식은 조건이 3개(줄, 공백, 별)

for <#item#> in <#items#> {
    for <#item#> in <#items#> {
        for <#item#> in <#items#> {
            <#code#>
        }
    }
}

이런식의 3중 for문을 생각했다. 이렇게 하면 신기한 모양만 나온다.

더보기

 

 

이런식으로 3중 for문 사용시 타일 모양이 된다.2중 for문 중 안쪽 for문 2개를 병렬식처럼 쓰면 해결된다.

첫 번째 바깥쪽 for문은 행의 수를 만들고,

두 번째 안쪽의 첫 번째 for문은 공백을 만들고,

세 번째 안쪽의 두 번째 for문은 별을 만든다.

안쪽 for문이 돌아가는 횟수는 바깥쪽 for문에 변수를 하나 주고 그 변수를 이용해 안쪽 2개의 for문에 각각 등차수열 공식을 세운다.

물론, 조건에 0 이 들어가면 1번 실행, 1이 들어가면 2번 실행 이런식이라 등차수열에서 조건에 따라 +1 또는 -1 해줘야한다. 또한 수학으로는 공백과 별의 수가 1 3 5 7 이런식으로 공차가 2지만 i값이 +1씩 변하기 때문에 for문에는 공차는 +1 또는 -1만 해줘야한다. 그리고 값의 범위도 수학에서는 1~7 이지만 컴퓨터에는 0~6이 되니까 고려할 것.

이게 단순히 머리로만 생각하면 답이 안 나온다...

i (줄을 만든다) j (공백을 만든다) k (별을 만든다)
0 3 0
1 2 2
2 1 4
3 0 6

이런식으로 꼭 손코딩을 해보자.

 

다이아몬드에서는 처음 실수했던 부분은 if문과 else if문만 썼다. if문이 다 돌아가면 else if 문으로 돌아가겠지 하고

var m = 0

if m < 3 {
    <#statements#>
    m = m + 1
} else if m > 3 {
    <#statements#>
}

이렇게 넣었다. if문의 마지막 4회차 돌면 m = 4가 되어 있을테니까...

처음 진입시 if문에서 조건이 맞으면 if문을 돌리고 빠져나가고, if문에서 조건이 맞지 않지만 else if문에서 조건이 맞으면 else if문을 돌리고 빠져나간다는 것을 떠올리지 못했었다.

따라서 m 값은 중요하지 않고 단지 m 이 처음 if문을 진입하기 위해 if문의 조건을 만족시키고, if문을 나왔을 때 if문의 조건은 만족하지 않지만 else if문의 조건을 만족하게 for 문을 0...1 로 딱 2번 돌아가게 하면 되는거였다.

+ Recent posts