EYEN
[빡공팟 4기] 3주차: C언어 배우기 코드업 기초 100제(71번~)write-up 본문
[빡공팟 4기] 3주차: C언어 배우기 코드업 기초 100제(71번~)write-up
EYEN 2022. 5. 8. 06:0071 76 82 85 88 89 93 96 98 99 write up



짠~
#71 0 입력될 때까지 무한 출력하기1
[문제]
정수가 순서대로 입력된다.
-2147483648 ~ +2147483647, 단 개수는 알 수 없다.
0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자.
while( ), for( ), do~while( ) 등의 반복문을 사용할 수 없다.
[제출 코드]
#include <stdio.h>
int main()
{
int n;
reload:
scanf("%d", &n);
if (n != 0)
{
printf("%d\n", n);
goto reload;
}
}
goto 제어문: 'goto (레이블)' 형태로, 이 제어문과 함께라면 코드 어디든 갈 수 있다. 그래서 복잡해지기 쉬우므로 남발하지 않도록 주의해야한다. 레이블의 이름은 마음대로 정할 수 있다.
반복문처럼 n이 0이 아니면 출력하고, 다시 입력받는 곳으로 가도록 만들었다.
#76 문자 1개 입력받아 알파벳 출력하기
[문제]
영문자(a ~ z) 1개가 입력되었을 때 그 문자까지의 알파벳을 순서대로 출력해보자.
[제출 코드]
#include <stdio.h>
int main()
{
char a,t='a';
scanf("%c", &a);
do{
printf("%c ",t);
t += 1;
} while (t < a+1);
return 0;
}
do while 반복문: do while{반복할 코드, 변화식}while(조건식) 형태이다. do 다음에 오는 코드는 무조건 한번은 실행된다.
그래서 제일 처음 실행될 printf를 위해 t='a'로 선언하고, t를 하나씩 더해주며 t<a+1라는 조건으로 입력받은 a까지 출력한다.
#82 16진수 구구단
[문제]
16진수(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)를 배운
영일(01)이는 16진수끼리 곱하는 16진수 구구단에 대해서 궁금해졌다.
A, B, C, D, E, F 중 하나가 입력될 때,
1부터 F까지 곱한 16진수 구구단의 내용을 출력해보자.
(단, A ~ F 까지만 입력된다.)
[제출 코드]
#include <stdio.h>
int main()
{
int a;
scanf("%X", &a);
for (int i = 1; i < 16; i++) {
printf("%X*%X=%X\n", a, i, a * i);
}
}
16진수를 출력해야하는데 대문자라서 대문자 X를 써야한다....!! 당연하다고 생각하고 넘어가니까 까먹지..
for 반복문: for(초기식;조건식;변화식)형태이다.
그리고 3*4=12이런 형태로 출력해야하기 때문에 출력형태도 맞춰야한다!
#85 소리 파일 저장용량 계산하기
[문제]
1초 동안 마이크로 소리강약을 체크하는 수 h, 한 번 체크한 결과를 저장하는 비트 b, 좌우 등 소리를 저장할 트랙 개수인 채널 c, 녹음할 시간 s가 주어질 때, 필요한 저장 용량을 계산하는 프로그램을 작성해보자.
[제출 코드]
#include <stdio.h>
int main()
{
int h, b, c, s;
scanf("%d %d %d %d", &h, &b, &c, &s);
printf("%.1f MB", ((double)h * (double)b * (double)c * (double)s) / (8*1024*1024));
}
연산자나 제어문을 써보기 위한 문제가 아닌 생각을 해야하는 문제가 나와서 어렵다고 생각했다.
비트에서 메가바이트로 단위를 맞추는 문제였다. 8bit=1byte/ 1024byte=1KB/ 1024GB=1MB
그리고 실수형으로 소수점까지 출력해야되니까 (double)도 붙여야 한다~!
#88 3의 배수는 통과?
[문제]
1부터 입력한 정수까지 1씩 증가시켜 출력하는 프로그램을 작성하되,
3의 배수인 경우는 출력하지 않도록 만들어보자.
[제출 코드]
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
for (int i = 1; i <= a; i++)
{
if (i % 3 == 0)
continue;
else
printf("%d ", i);
}
}
continue: continue 다음에 오는 코드를 실행하지 않고 넘어간다는 뜻이다.
break: 반복문을 부순다, 아예 반복문 밖으로 나온다는 뜻이다.
for 반복문으로 1부터 입력받은 값까지 검사하며, if,else로 3의 배수가 아니면 출력하도록 했다.
#89 수 나열하기1
[문제]
시작 값(a), 등차(d), 몇 번째인지를 나타내는 정수(n)가 입력될 때
n번째 수를 출력하는 프로그램을 만들어보자.
[제출 코드]
#include <stdio.h>
int main()
{
int a,d,n;
scanf("%d %d %d", &a, &d, &n);
for (int i= 1;i<=n;i++)
{
a += d;
if (i==n-1)
printf("%d",a);
}
}
등차수열 구하는 코드를 작성하면 된다. 입력받은 첫번째 항에 공차를 더하는 것을 n-1번 반복하여 출력한다.
그냥 등차수열 공식으로 풀어도 되고, 그러면 코드도 짧다!
+
#include <stdio.h>
int main()
{
int a,d,n;
scanf("%d%d%d", &a, &d, &n);
printf("%d", a + (d * (n - 1)));
}
#93 이상한 출석 번호 부르기1
[문제]
출석 번호를 n번 무작위로 불렀을 때, 각 번호(1 ~ 23)가 불린 횟수를 각각 출력해보자.
[제출 코드]
#include <stdio.h>
int main()
{
int n, i, t;
int a[24] = {}; //0번부터 23번까지 모두 0으로 초기화된다.
scanf("%d", &n); //횟수 입력받기
for (i = 1; i <= n; i++)
{
scanf("%d", &t); //부른 번호에 해당하는 순서의 배열 숫자 1 더해서 재정의
a[t] = a[t] + 1;
}
for (i = 1; i <= 23; i++)
{
printf("%d\n", a[i]); //1부터 23까지 출력하기
}
}
a[24] :0~23까지 정수를 저장할 수 있는 배열을 만들어라.
a[24]={1,2,3} :1,2,3 이 순서대로 들어가고 나머지는 모두 0으로 초기화된다.
int a[3]={1,2,3}; //1,2,3 이 순서대로 저장된다.
int a[3]={1,2,3,4}; //공간은 3개 값은 4개 = 오류 발생!
#96 바둑판에 흰 돌 놓기
[문제]
바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,
n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.
[제출 코드]
#include <stdio.h>
int main()
{
int n, i, j, x, y;
int a[20][20] = {}; //2차원 배열 a 선언
scanf("%d", &n); //횟수 입력받기
for (i = 1; i <= n; i++) //x,y 입력받아서 해당되는 부분 1로 바꾸기
{
scanf("%d %d", &x, &y);
a[x][y] = 1;
}
for (i = 1; i <= 19; i++)
{
for (j = 1; j <= 19; j++)
{
printf("%d ", a[i][j]);
}
printf("\n"); //가로 한 줄 출력후 띄우기
}
}
이런 문제 풀 때 \n를 빼먹거나 잘못된 부분에 넣는 일이 꽤 있으니 꼭 유심히 생각하도록 하자.
#98 설탕과자 뽑기
[문제]
격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l),
막대를 놓는 방향(d:가로는 0, 세로는 1)과
막대를 놓는 막대의 가장 왼쪽 또는 위쪽의 위치(x, y)가 주어질 때,
격자판을 채운 막대의 모양을 출력하는 프로그램을 만들어보자.
[제출 코드]
#include <stdio.h>
int main()
{
int w, h, n, d, l; //순서대로 너비, 높이, 막대 개수, 방향, 막대 길이
int x, y; //좌표
int a[150][150] = {};
scanf("%d %d", &w, &h); //너비와 높이 입력받기
scanf("%d", &n); //막대 개수 입력받기
for (int i = 1; i <= n; i++) { //입력받은 막대개수만큼 반복
scanf("%d%d%d%d", &l, &d, &x, &y);
for (int j = 0; j < l; j++) { //입력받은 막대길이-1 만큼
if (d == 0) a[x][y+j] = 1; //가로방향이면 입력받은 좌표에서 y방향으로 막대길이만큼 더하기
else a[x+j][y] = 1;//세로방향일 경우
}
}
for (int i = 1; i <= h; i++) { //2차원 배열 입력받은대로 출력
for (int j = 1; j <= w; j++) {
printf("%d ", a[i][j]);
}
printf("\n");
}
}
개인적으로 기초 100제에서 이 문제가 제일 어려웠다. 일단 내가 아는 x,y방향이 아니어서 살짝 헷갈렸고, 변수도 많아서 초반에 좀 힘들었다. 어려운 문제는 공책에 적으면서 풀면 더 잘 풀린다. 막히면 고민없이 공책을 펴자.
#99 성실한 개미
[문제]
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고, 먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자. 단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾는 경우에는 더 이상 이동하지 않고 그 곳에 머무른다고 가정한다. 미로 상자의 테두리는 모두 벽으로 되어 있으며, 개미집은 반드시 (2,2)에 존재하기 때문에 개미는 (2,2)에서 출발한다.
[제출 코드]
#include <stdio.h>
int main()
{
int a[11][11] = {}; //개미집
int x = 2, y = 2; //개미가 (2,2)부터 이동하므로
int i, j;
for(i = 1; i <= 10; i++) //개미집 2차원 배열 만들기
for(j = 1; j <= 10; j++)
scanf("%d", &a[i][j]);
while(a[x][y]!=2){ //먹이가 나올 때까지 개미가 지나다니는 곳 다 9임.
a[x][y] = 9;
if (a[x+1][y] != 1) x += 1; //오른쪽이 0이면 오른쪽으로
else if (a[x][y+1] != 1) y += 1; //오른쪽은 1인데 아래쪽이 0이면 아래쪽으로
else break; //둘 다 아니면 멈춰
}
a[x][y] = 9; //먹이 있는 곳도 9임.
for(i = 1; i <= 10; i++){ //2차원 배열 출력하기
for(j = 1; j <= 10; j++){
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
while, if, for와 배열을 다 쓰는 문제였다. 반복문의 정의뿐만 아니라 어디서 어떻게 써야하는지 이해하고 있는게 중요하다고 생각했다. 구체적인 조건을 달 땐 for문을 쓰는게 좋은 것 같다.
'대외활동 및 팀플 > 빡공팟(P4C) 시스템 해킹 트랙 4기' 카테고리의 다른 글
[빡공팟 4기] 6주차 과제: 어셈블리어로 구구단 구현하기/c로 더블 링크드 리스트 구현하기 (0) | 2022.05.29 |
---|---|
[빡공팟 4기]6주차 과제: 제공된 파일 한장으로 요약 (0) | 2022.05.25 |
[빡공팟 4기] 4~5주차:c로 http 서버 만들기 (0) | 2022.05.22 |
[빡공팟 4기] 2주차: C언어 배우기 코드업 기초 100제(70번 이하)write-up (0) | 2022.05.01 |
[빡공팟 4기] 1주차: C언어 배우기 코드업 기초 100제(20~30번) write-up (0) | 2022.04.24 |