첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제
하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
링크텍스트
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.
이 문제도 오래 걸렸다.. 어떻게 해야하는건지 감은 왔는데 구현이 안되는 느낌이랄까..
일단 for문으로 전체적인 반복을 잡고,
그 안에 또 for문으로 공백을 표현하고 다시 for문으로 *을 표현해야한다는 건 알았지만 이 for문들의 순서라던지 공백을 표현하는 for문의 초기식이랑 조건식을 어떻게 잡을지 고민을 많이 했던 거 같다. 결국 이렇게도 해보고 저렇게도 해보면서 여러 시도를 하다가 고민이 하루를 넘어가니깐 답답해서 구글링을 해보았다.
내가 한 첫번째 시도 코드는 이러하다.
#include <stdio.h>
int main()
{
int n; //별 개수
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
for(int s=n-1; s>=0; s--)
{
printf(" ");
}
for(int j=1; j<=i; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
이렇게 보면 내가 무엇을 잘못 생각하고 있었는지 명확히 보인다. 대략적인 구조는 잘 잡았지만 공백 출력 for문의 초기식과 조건식을 잘못 잡았다. 초기식에서 n-1을 하면 한줄마다 공백의 개수가 달라져야 하는데 동일하다. 난 여기서 너무 일차원적으로 생각했던 거 같다. 그리고 조건식도 0으로 기준을 잡아버리면 공백이 하나씩 더 출력된다.
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++) // 몇번째 줄인지를 나타내주는 for문(줄바꿈 표시도)
{
for(int j=(n-i); j>=1; j--) //공백을 표현해주는 for문
{
printf(" ");
}
for(int j=1; j<=i; j++) //*을 출력해주는 for문
{
printf("*");
}
printf("\n");
}
return 0;
}
이 문제를 풀면서도 많이 배울 수 있었다.
첫번째는 위에 공백-for문과 *-for이 같은 변수를 사용하고 있는데, 나는 for문마다 무조건 다른 변수를 사용해야 한다고 생각해왔던 거 같다. 여기서 2개의 for문 모두 변수 j를 사용하지만 각자 for문에 다시 j를 선언하므로 상관없다. 물론 다른 변수를 사용하여도 정답이다.
두번째는 for문의 초기식과 조건식의 관계이다. 위의 코드에서는 저렇게 적혀있지만 꼭 저것만은 정답이 아니다. 의미만 같으면 다르게 적어도 맞다. 나는 공백-for문의 for(int j=(n-i); j>=1; j--)을 for(int j=1; j<=(n-i); j++)로 바꿔보았는데 이것도 정답이었다. 각각 사용되는 for문의 반복 범위를 정확히 하는 것이 중요한 것 같다.
마지막으로 for문의 실행순서이다. 간단한 for문은 쉽지만 for문이 여러개 쓰일수록 너무 헷갈리고 정신이 없었는데, 내가 코드 실행순서를 아직 정확히 숙지 못한거 같다.
위의 코드에서는 만약 n이 4를 입력받았다고 가정하였을 때,
첫번째 for문에서 i=1
-> 두번째 for문에서 j=(4-1)=3으로 설정
-> printf로 내려가서 공백 하나 출력
-> 다시 두번째 for문으로 올라와서 변화식에 의해 j=2
-> printf로 내려가서 이어서 공백 하나 출력
-> 다시 두번째 for문으로 올라가서 변화식에 의해 j=1
-> printf로 내려가서 이어서 공백 하나 출력
-> 두번째 for문 탈출
-> 세번째 for문에서 j=1
->printf로 내려가서 *출력
-> 세번째 for문 탈출
-> 밑에 printf로 내려가서 줄바꿈
->다시 첫번째 for문으로 올라가서 i=2
...
이 과정 반복
이렇게 코드를 하나씩 실행해보고 순서를 정리해보니깐 내가 뭘 헷갈리고 있는지 알 수 있었다.
간단하게 for문의 실행순서를 정리해보자면
첫번째 for에서 i=1로 계속 가고 -> 두번째 for에서 변수의 초기값부터 조건값까지 순차적으로 한줄에 출력하고 탈출 -> 세번째 for에서도 변수의 초기값부터 조건값까지 이어서 그 줄에 출력하고 탈출 -> 줄바꿈 print되고 첫번째 for문으로 가서 i=2 -> 첫번째 for의 i값이 조건에 닿을때까지 과정 반복
-> 끝
아직까지도 for문이랑 그렇게 친한 느낌은 아니지만.. 우리 잘해보자...!
익숙해질때까지 많이 써봐야겠다..!!