-
[C언어] 정올 148 : 반복제어문3 - 형성평가9 ( 풀이 포함 / for문 3개 )프로그래밍/알고리즘 2020. 4. 25. 03:00
- 자연수 n을 입력받아 "출력 예"와 같이 공백으로 구분하여 출력되는 프로그램을 작성하시오.
- 주의! '#'은 공백으로 구분하되 줄사이에 빈줄은 없다.
#include <stdio.h> int main(){ int n; scanf("%d", &n); for(int i = -n+1; i<n; i++){ if(i>0&&i<n){ for(int j = 0;j<i;j++) printf(" "); } for(int j = 0;j<n-(i>0?i:-i);j++) printf("# "); printf("\n"); } }
풀이
처음에는 위 사진처럼 위에 n줄 따로 출력하고, 밑에 n-1줄 따로 출력할까 생각했었다.
하지만 프로그래밍을 하면서, 수동적인 코딩은 좋지 않을 것이라고 생각했고, 또한 소스가 길어지는 것을 보고 싶지 않았다.
#이 n개로 유지된채 오른쪽으로 이동한다고 생각하고 범위 안에서만 출력이 될 수 있도록 구상해보았다.
외부 for문
행을 출력할 바깥 for문은
for(int i = -n+1; i<n; i++)
이와 같이 -n부터 n까지 커질 수 있는 조건을 가진다.
내부 빨간 for문
1, 2, 3, 2, 1 순서로 크기가 변경된다.
이는 3 - | -2 |, 3 - | -1 |, 3 - | 0 |, 3 - | 1 |, 3 - | 2 |와 같은 의미이다.
따라서 N - | i |의 수 만큼 #의 개수가 정해진다는 것을 알 수 있다.
for(int j = 0;j<n-(i>0?i:-i);j++){ printf("# "); }
내부 파란 for문
파란 for 문에서 볼 수 있다시피, 0을 넘어선 행의 인덱스 수와 띄어쓴 칸이 일치하는 것을 알 수 있다.
따라서 행이 1, 2 일때 for문을 사용하여 띄어쓰기를 해주면 된다.
if(i>0&&i<n){ for(int j = 0;j<i;j++) printf(" "); }
이를 조합하여 소스를 작성해주면 된다.
반응형'프로그래밍 > 알고리즘' 카테고리의 다른 글
[C언어] 정올 555 : 배열1 - 자가진단1 (0) 2020.04.26 [C언어] 정올 149 : 반복제어문3 - 형성평가A (0) 2020.04.25 [C언어] 정올 147 : 반복제어문3 - 형성평가8 (0) 2020.04.25 [C언어] 정올 146 : 반복제어문3 - 형성평가7 (0) 2020.04.25 [C언어] 정올 145 : 반복제어문3 - 형성평가6 (0) 2020.04.25