/* 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번 돌아가게 하면 되는거였다.
'개발자 > Swift' 카테고리의 다른 글
Swift (스위프트) 연습 첫 번째 (0) | 2020.03.31 |
---|---|
Swift (스위프트) 함수 & 단축키 모음 (0) | 2020.03.31 |
Swift (스위프트) 별 찍기와 반복문에 대한 고찰 (0) | 2020.03.26 |
Swift (스위프트) 구구단 만들기 (0) | 2020.03.25 |
Swift (스위프트) 자료형, 형변환, 기본 문법 (0) | 2020.03.25 |