안녕하세요 성조입니다.
종강과 동시에 C언어 부족한 부분을 시작으로 자료구조, 웹, 알고리즘 등을 공부를 조금씩 시작했습니다.
그런데 제가 학과 변경을 하면서 친구가 C언어 책이 3권 있다고 준다 했던 책에 나온 *로 패턴이 그려진 문제를 봤더니 보자마자 눈으로 안 풀려서 엥 어떻게 풀었지..라는 생각으로 문제당 5분은 잡은 것 같네요.. 그래서 이런 패턴 문제가 나오면 다음에는 바로 풀기 위해서 개인 풀이를 남겨보려 합니다.
다음 패턴의 해설을 시작하겠습니다.
* | * | * | * | * | * |
* | * | ||||
* | * | ||||
* | * | * | * | * | * |
위 표는 문제 (a) 번에 제시된 모습을 따온 것입니다.
표의 패턴을 보면 가로 4줄 세로 6줄의 칸이 존재합니다.
(i, j)의 2x2행렬로 표현하면 2,2~2,5와 3,2~3,5의 공간이 빈 것을 알 수 있습니다.
즉 i의 1행, 4행 j의 1열, 6열의 조건이 만족하는 경우에만 출력을 진행하고 나머지는 공백으로 처리를 하면 위 문제의 조건을 만족할 수 있습니다.
i의 1, 4행 j의 1, 6 열인 경우만 출력하는 소스코드를 구현하면 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
int main(){
for (int i = 1; i < 5; i++) {
for (int j = 1; j < 7; j++) {
if((i == 1 || i == 4) ||(j==1||j==6)){
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
|
cs |
이중 for문의 경우 첫 for문은 가로 두 번째 for문의 경우 세로의 2차원 형식의 반복문으로 사용됩니다.
이때 i의 값에 1행 또는(OR) 4행인 경우 출력, j의 값에 1열 또는 6 열인 경우 출력의 조건이 if문으로 대입되고 거짓인 경우 공백을 넣어서 프로그램을 진행하는 형식으로 구현을 했습니다.
for문이 두 개가 돌기 때문에 시간은 n^2만큼 들지만 만약 for문을 하나만 이용하여 다음 패턴이 구현이 가능하다면?(의문입니다) 반복 횟수는 많이 줄 수 있는 문제일 것 같습니다.
하지만 이 문제 자체가 그러한 조건이 주어지지 않았고 앞장에 있는 문제이므로 위의 방법으로 간단하게 풀었습니다.
(b)의 문제의 경우
(a) 번의 문제에서 행만 1행(가로) 추가가 된 문제입니다.
* | * | * | * | * | * |
* | * | ||||
* | * | ||||
* | * | ||||
* | * | * | * | * | * |
위의 소스코드에서 i의 값만 변경을 해주면 됩니다. 1부터 5까지 반복할 수 있으며, if 조건에서 i가 4가 아닌 5를 만족하는 경우 라인을 생성하는 방식으로 진행해주시면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
int main(){
for (int i = 1; i < 6; i++) {
for (int j = 1; j < 7; j++) {
if((i == 1 || i == 5) ||(j==1||j==6)){
printf("*");
}
else {
printf(" ");
}
}
printf("\n");
}
}
|
cs |
(c) 번의 경우 다이아몬드 형태의 문제이며 다음은 그 문제를 테이블 형식으로 작성한 모습입니다.
* | ||||||
* | * | |||||
* | * | |||||
* | * | |||||
* | * | |||||
* | * | |||||
* |
문제는 7x7의 속이 빈 다이아몬드를 만드는 문제였습니다.
다음 화면은 문제를 출력한 디버깅 화면입니다.
소스코드입니다.
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
31
32
33
34
35
|
#include <stdio.h>
int main(){
for (int i = 1; i < 5; i++){
for (int j = i+1; j < 5; j++){
printf(" ");
}
for (int j = 1; j <= i * 2; j++)
{
if (j == 1 || j == i * 2 - 1){
printf("*");
}
else{
printf(" ");
}
}
printf("\n");
}
for (int i = 1; i < 4; i++){
for (int j = 2; j <= i; j++){
printf(" ");
}
for (int j = 8; j >= i * 2; j--)
{
if (j == 8-1 || j == i * 2 + 1){
printf("*");
}
else{
printf(" ");
}
}
printf("\n");
}
}
|
cs |
소스코드를 혼자 구현하려 했는데 이해가 안 가는 부분이 있어서 완벽하게 스스로 구현한 것이 아니라 인터넷에 이런저런 소스코드를 참고하면서 수정해본 코드입니다.
for문을 2중으로 돌리는 하나의 직선 또는 그 이상을 디버깅 화면에 그을 수가 있는데 인터넷에서 쉽게 보이는 대각선 긋기는 for문안에 for문 즉 2중 for문인데 그것을 대칭하게 만든다면 3중 for문으로 그릴 수 있게 됩니다.
그렇게 패턴을 만들면 다음과 같은 디버깅 화면이 나옵니다.
위 패턴을 만드는 소스코드입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <stdio.h>
int main(){
for (int i = 1; i < 5; i++){
for (int j = i+1; j < 5; j++){
printf(" ");
}
for (int j = 1; j <= i * 2; j++)
{
if (j == 1 || j == i * 2 - 1){
printf("*");
}
else{
printf(" ");
}
}
printf("\n");
}
}
|
cs |
이의 역으로 소스코드를 처음 소개드린 까지 만들면 빈공간이 있는 7x7 다이아몬드의 모양이 나옵니다.
2022.12.07
오아니님이 질문해 주신 내용에 대한 답변입니다.
안녕하세요 오아니님!
최근에 급성 편도염에 걸려서 댓글 확인이 늦어졌습니다.😥
node.js에서의 별 찍기를 진행하실 때.
console.log를 활용해서 진행을 해주셨는데요.
제가 아는 console.log의 경우 java의 System.out.println() 처럼 입력 후 자동으로 줄을 개행해 주는 것으로 알고 있습니다.
console.log로 문제를 해결해 주시는 경우.
1. 3+공백 / +별 / 3+공백
2. 2+공백 / +별 / 공백 / +별 / 2+공백
...
와 같이 문제를 풀이를 진행해 주시면 해결할 수 있으리라 생각됩니다.
document.write() 함수 또는 process.stdout.write() 함수를 활용하여 문제 풀이를 진행해 주시는 방법도 존재한 것으로 알고 있습니다!
도움이 되셨으면 좋겠습니다.
좋은 하루 보내세요!
다음 포스팅 때 뵙겠습니다!
감사합니다.
'C, C++ > C' 카테고리의 다른 글
[C언어] 카프리카수 구하기, 네 자리 Kaprika수 구하기 프로그램 (2) | 2020.12.29 |
---|---|
[C언어] 조건을 만족하는 정사각형의 한 변의 길이를 구하는 프로그램 (0) | 2020.12.26 |
[C언어 ] 라이프니츠 공식(Leibniz formula)을 50만항을 계산하는 프로그램 (0) | 2020.12.19 |
[C언어] 소수 판별하는 소스코드 (0) | 2020.12.14 |
[C언어] 10, 8, 16, 2진수로 0~255값 출력하기 (2) | 2020.12.11 |