별찍기 문제 풀이
•
백준 2438 별 찍기 - 1
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
int num;
scanf("%d", &num);
// i가 1부터 시작하는 이유? : 별이 찍히는 최소 개수가 1개이기 때문 (본인이 편한대로)
for (int i = 1; i <= num; i++) {
for (int j = 0; j < i; j++) {
printf("*");
}
printf("\n");
}
}
C
복사
•
백준 2439 별 찍기 - 2
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
int num;
scanf("%d", &num);
/*
공백 4 별 1 -> j (1 ~ num-i)
공백 3 별 2
공백 2 별 3
공백 1 별 4
공백 0 별 5
*/
for (int i = 0; i < num; i++) {
// 공백 (N - i)
for (int j = 1; j < num - i; j++) {
printf(" ");
}
// 별 (i)
for (int k = 0; k <= i; k++) {
printf("*");
}
printf("\n");
}
}
C
복사
•
2021년 1학기 기말고사 콘테스트(1) D 별 찍기 - 안이 빈 사각형
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
int testcase;
scanf("%d", &testcase);
for (int i = 0; i < testcase; i++) {
int x, y;
scanf("%d %d", &x, &y);
// (x, y) == (1, 1)인 경우 처리
if (x == 1){
for (int i = 0; i < y; i++) {
printf("*\n");
}
continue;
}
else if (y == 1) {
for (int i = 0; i < x; i++) {
printf("*");
}
}
// 일반적인 경우 처리 -> 윗면, 중앙, 아랫면 -> 3개로 나눠서 별을 찍자!
else {
// 첫번째 for문 : 윗면
for (int i = 0; i < x; i++) {
printf("*");
}
printf("\n");
// 두번째 for문 : 중앙
for (int i = 0; i < y - 2; i++) {
// 시작하는 별
printf("*");
if (x > 2 && y > 2) {
// 공백 (안이 빈 사각형이어야 하므로 공백을 넣어주자!)
// 시작하는 별과 끝내는 별을 따로 찍어주기로 했다.
// 그렇다면 2개의 별을 제외한 개수만큼 공백을 찍어주자.
for (int j = 0; j < x - 2; j++) {
printf(" ");
}
}
// 끝내는 별
printf("*\n");
}
// 세번째 for문 : 아랫면
for (int i = 0; i < x; i++) {
printf("*");
}
}
printf("\n");
}
}
C
복사
•
2021년 1학기 기말고사 콘테스트(2) E 별 찍기 - 안이 빈 삼각형
#include <stdio.h>
#include <string.h>
#include <math.h>
int main() {
int testcase;
scanf("%d", &testcase);
while (testcase--) {
int x; // 밑변의 길이(삼각형의 크기를 결정)
scanf("%d", &x);
// 변의 길이가 1인 경우를 처리함
if (x == 1) printf("*");
// 변의 길이가 2 이상인 경우를 처리함
if (x >= 2) {
// 첫번째 for문 : 꼭짓점부터 밑변 전까지의 삼각형을 찍어주자
for (int i = 0; i < x - 1; i++) {
if (i != 0) { // 첫 줄은 제외한다. (닫아주는 별 찍는 부분에서 처리)
// 시작하는 별
printf("*");
}
// 시작하는 별을 찍어줬으니 i - 1번 반복
for (int j = 0; j < i - 1; j++) {
// 공백 -> 안이 빈 삼각형을 표현하자!
printf(" ");
}
// 닫아주는 별 찍고 개행
// 첫 줄을 찍어주는 과정이라면, 꼭짓점 별을 의미한다.
printf("*\n");
}
// 두번째 for문 : 밑변 -> 입력받았던 변의 길이만큼 쭉 별을 찍어주자
for (int i = 0; i < x; i++) {
printf("*");
}
}
printf("\n");
}
}
C
복사
이론 (1) : 배열 기초
배열 생성
int a = 1, b = 2, c = 3; /* ... */ int j = 10;
int scores[10];
float scores2[20];
char name[50];
// type name[size];
// 자료형 이름[크기];
C
복사
배열 요소 접근
•
배열을 순회하며 값 초기화하기
// 하나씩 초기화
scores[0] = 0;
/* ... */
scores[9] = 90;
// 중괄호로 초기화
scores[10] = { 0, 10, 20, /* ... */ , 90 };
// for문으로 초기화
for(int i = 0; i < 10; i++) {
scores[i] = i * 10;
}
C
복사
•
배열의 모든 값을 0으로 초기화
// for문 순회 초기화
for(int i = 0; i < 10; i++){
scores[i] = 0;
}
// 쉬운 방법!
int scores[10] = { 0, };
C
복사
•
값 접근
int number;
scanf("%d", &number); // 10 입력
scores[number] = 40; // scores[10] = 40; -> 값 대입
scores[2] = scores[number]; // scores[2] = scores[10] -> 값 복사
C
복사
배열 사용 시 주의할 점!
•
배열을 초기화하지 않으면 쓰레기값이 저장되어 있다.
int array[3];
print("%d", array[2]); // 이상한 쓰레기값이 출력됨
C
복사
•
배열의 인덱스는 0부터 시작한다.
int array[3] = { 1, 2, 3 }; // array[0] ~ array[2]
for(int i = 1; i <= 3; i++){
print("%d", array[i]); // array[3] -> 인덱싱 오류!
}
// 올바른 접근 방법
for(int i = 0; i < 3; i++){
print("%d", array[i]);
}
C
복사