[L01]Layer7 H.W.
[백준] 25304 영수증
가격의 총합, 물건의 종류, 물건의 개수, 물건의 가격을 입력받고 가격의 총합과 구매한 물건의 가격이 일치하는지 확인하여 Yes, No를 출력하는 문제입니다.
int X,N,a,b,i;
먼저 가격의 총합(X) 물건의 종류(N) 물건의 가격(a), 물건의 개수(b), 반복문의 변수(i)를 선언해줍니다.
for(i=0; i<N; i++){
scanf("%d %d", &a, &b);
X -= a*b;
}
N번 만큼 a,b에 물건의 가격과 개수를 입력받고 이를 곱한값을 가격의 총합(X)에서 빼줍니다.
if(X==0){
puts("Yes");
}
else{
puts("No");
}
만약 가격의 총합과 구매한 물건의 가격이 일치하면 X는 0이여야 하기에 X가 0이면 Yes를 출력합니다.
[백준] 25314 코딩은 체육과목 입니다
N바이트 정수까지 저장할 수 있다고 생각하는 정수 자료형의 이름을 출력하는 문제입니다.
즉 long을 N/4 만큼 출력 한 후 int를 붙히면 되는 문제입니다.
int N;
scanf("%d", &N);
먼저 N을 선언하여 입력받습니다.
for(int i=0; i<N/4; i++){
printf("long ");
}
printf("int");
N/4번 만큼 long 을 반복하여 출력한 후 int를 붙혀주면 됩니다.
[백준] 10810 공 넣기
바구니 수와 공을 넣는 횟수를 N, M으로 입력받고 M번 a,b,c를 입력 받습니다. 이때 a~b번의 바구니를 c라는 공으로 채운다 생각하면 됩니다.
출력은 각 바구니에 어떤 공이 들어있는지 출력하면 되는 문제입니다..
int N,M;
scanf("%d %d", &N, &M);
int BK[N-1];
int a = 1, b = N, c = 0;
for(int j=a; j<=b; j++){
BK[j-1] = c;
}
먼저 N, M을 입력받고 BK라는 배열을 만들어 0으로 초기화 해주었습니다.
for(int i=0; i<M; i++){
scanf("%d %d %d", &a, &b, &c);
for(int j=a; j<=b; j++){
BK[j-1] = c;
}
}
이후 a, b, c를 입력받아 BK의 a~b부분을 c로 채우는 명령을 M번 반복하는 코드를 이중 for문을 이용하여 구현하였습니다.
for(int i=0; i<N; i++){
printf("%d ", BK[i]);
}
배열을 예제처럼 출력하는 코드입니다.
[백준] 10813 공 바꾸기
N개의 1...N이 들어있는 바구니에서 M번동안 입력받은 a번째와 b번째 공을 바꾸는 코드를 짜는 문재입니다.
int N,M;
scanf("%d %d", &N, &M);
int BK[N];
int a = 1, b = N;
for(int j=a; j<=b; j++){
BK[j-1] = j;
}
먼저 N,M을 입력받고 N크기의 BK배열에 1...N을 넣었습니다.
for(int i=0; i<M; i++){
int a,b;
scanf("%d %d", &a, &b);
int temp = BK[a-1];
BK[a-1] = BK[b-1];
BK[b-1] = temp;
}
M번동안 a,b값을 입력 받고 이를 temp변수를 통하여 a번째 바구니와 b번째 바구니의 값을 바꾸어 주었습니다.
for(int i=0; i<N; i++){
printf("%d ", BK[i]);
}
이후 출력 예제처럼 출력해주었습니다.
[백준] 과제 안 내신 분..?
28개의 입력중 빠져있는 2개의 숫자를 찾으면 되는 문제이다.
int ST[28] = {0};
int STSUM = 0;
for(int i=0; i<28; i++){
scanf("%d", &ST[i]);
STSUM += ST[i];
}
먼저 28길이의 ST 배열을 선언해주고 이를 입력값으로 채워줍니다.
이떄 이후 빠진값을 찾을때 사용할 STSUM(총합)도 같이 계산해줍니다.
int STLEAK = 465 - STSUM;
int flag = 0;
for(int i = 1; i<STLEAK/2; i++){
for(int j=0; j<28; j++){
if(ST[j] == STLEAK-i || ST[j] == i){\
flag = 1;
break;
}
}
if (flag != 1){
printf("%d\n%d",i,STLEAK-i);
break;
}
flag = 0;
}
STLEAK은 1부터 30까지의 총합 465에서 입력값의 총합을 구하여 빠진 두 수의 합을 구합니다.
이를 for문에 넣어 빠진 두 수의 합을 통해 그 두 수의 경우의 수를 구하고 그 경우의 수가 ST배열에 있는지 확인하여 flag를 올리고 내립니다.
만약 경우의 수중 두 수 전부 ST에 없다면 작은수인 i, 그리고 빠진 두 수의 합 - i 를 출력해줍니다.
[백준] 3052 나머지
int NUM[11];
int RNUM[11];
for(int i=0; i<10; i++){
NUM[i] = 0;
RNUM[i] = -1;
}
int flag = 0;
NUM에는 수가 담기고 RNUM에는 나머지가 담길것입니다. NUM은 0으로 채워주고 RNUM은 -1로 채워줍니다.
for(int i=0; i<10; i++){
scanf("%d", &NUM[i]);
for(int j=0; j<=10; j++){
if(RNUM[j] == NUM[i]%42){
flag = 1;
RNUM[i] = -1;
break;
}
}
if(flag == 0){
RNUM[i] = NUM[i]%42;
}
flag = 0;
}
10번동안 NUM배열에 수를 입력받아 넣으며 10번동안 RNUM중에 NUM[i]%42가 존재하는지 확인하고 존재한다면 그 부분에 나머지 대신 -1을 채워넣습니다.
즉 이전에 RNUM에 들어가지 않았던 나머지 값이라면 그 자리수에 나머지가 그대로 들어가고, 이미 존재하는 나머지면 -1을 넣는다는 이야기 입니다.
int sum = 0;
for(int i=0; i<10; i++){
if(RNUM[i] != -1){
sum++;
}
}
printf("%d", sum);
다시한번 10번 반복하며 RNUM이 -1이 아닌만큼 더하여 출력해주었습니다.
[백준] 10811 바구니 뒤집기
공 바꾸기 문제에 단순히 바꾸는 것이 아닌 역순으로 만들어 버리는 문제입니다.
int N,M;
scanf("%d %d", &N, &M);
int BK[N];
int BK2[N];
for(int i=0; i<N; i++){
BK[i] = i+1;
BK2[i] = i+1;
}
기본 바구니와 역순으로 바꾼 바구니의 공을 임시 저장할 배열 두개를 만들었습니다.
for(int i=0; i<M; i++){
int a,b;
scanf("%d %d", &a, &b);
for(int j=b-a; j >= 0; j--){
BK2[b-j-1] = BK[a+j-1];
}
for(int i=0; i<N; i++){
BK[i] = BK2[i];
}
}
M번 만큼 a,b(역순화 할 범위)를 입력받고 j는 b-a에서 하나씩 작아지며 BK[a+j-1]을 BK[b-1]에서부터 하나씩 줄어들게 만듭니다.(BK2[b-j-1]은 반대로 늘어납니다.) 이러면 BK2에는 a~b까지의 내용을 역순화한 내용이 들어가게됩니다.
위 내용 이후 BK2의 내용을 BK로 옮겨줍니다.
for(int i=0; i<N; i++){
printf("%d ", BK2[i]);
}
형식에 맞게 출력해주었습니다.
[백준] 1546 평균
int N;
scanf("%d", &N);
double SCORE[N];
for(int i=0; i<N; i++){
scanf("%lf", &SCORE[i]);
}
새로 만든 점수는 소수점이 나올 수 있음으로 double로 된 SCORE 라는 배열을 N 입력 크기만큼 만들어준다.
그리고 lf으로 입력받아 SCORE를 채워준다.
int max = SCORE[0];
for(int i=0; i<N; i++){
if(SCORE[i] > max){
max = SCORE[i];
}
}
SCORE에서의 최대값을 구한다.
for(int i=0; i<N; i++){
SCORE[i] = (double)SCORE[i]/max*100;
}
모든 점수를 새로 고친다.
double sum = 0;
for(int i=0; i<N; i++){
sum += SCORE[i];
}
printf("%lf", (double)sum/N);
모두 더해 평균을 구한다.
[백준] 2738 행렬 덧셈
int N,M;
scanf("%d %d",&N,&M);
int arr[N][M];
int arr1[N][M];
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
scanf("%d",&arr[i][j]);
}
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
scanf("%d",&arr1[i][j]);
}
}
N,M을 입력받아 N*M크기의 2차원배열을 두개 생성한다.
또한 N*M 형태로 생성한 배열에 입력을 받는다.
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
printf("%d ",arr[i][j]+arr1[i][j]);
}
printf("\n");
}
행렬의 같은위치 있는 값을 더해서 3*3 상자 형태로 출력한다.
[백준] 10798 세로읽기
char arr[5][16];
for(int i = 0; i < 5; i++){
for(int j = 0; j < 16; j++){
arr[i][j] = '\0';
}
}
for(int i = 0; i < 5; i++){
scanf("%s", arr[i]);
}
5*16크기의 문자를 담는 배열을 생성한 후 \0으로 채워넣는다.
이후 한줄씩 5번 입력받는다.
입력되지 않은줄(16칸이 안된줄)은 입력값이 빈 이후부터 \0으로 채워져 있을것이다.
for(int i = 0; i < 16; i++){
for(int j = 0; j < 5; j++){
if(arr[j][i] == '\0')
continue;
printf("%c", arr[j][i]);
}
}
여기서 행과 열을 바꾸어 출력을 해주고 문자가 \0이라면 출력하지 않도록 해주었다.
[백준] 1152 단어의 개수
char ST[1000001];
int space = 1;
fgets(ST, 1000001, stdin);
입력값의 최대 크기의 문자 배열을 생성하고 띄어쓰기를 포함해야 함으로 fgets를 이용해 입력받는다.
띄어쓰기를 이용해 단어 수를 계산하므로 space값의 초기값을 1로둔다.
if(ST[0] == ' ' & ST[1] == '\n'){
space--;
}
공백만 있는 경우도 있음으로 공백만 존재할시엔 space에서 1을 빼서 다시 0으로 만들어준다.
for(int i = 0; ST[i] != '\0'; i++){
if(ST[i] == ' ' & i!=0 & ST[i+1] != '\n'){
space++;
}
}
printf("%d", space);
ST에서 한칸씩 올리며 문자열이 끝날때까지 반복한다.
만약 그 칸이 공백이면 첫번쨰 칸인지, 마지막칸인지 확인하고 둘다 아니라면 space값을 1 증가시킨다.
이러면 space의 값은 단어의 수가 된다.
[백준] 2908 상수
char const1[4];
char const2[4];
char rsconst1[4] = {'\0', '\0', '\0', '\0'};
char rsconst2[4] = {'\0', '\0', '\0', '\0'};
scanf("%s %s", const1, const2);
숫자를 역순화 시키기 위해서는 문자열로 입력받아야 할 필요성을 느껴 문자열 4개를 선언하였다.
그중 위 두 문자열에 숫자값을 입력받았다.
for(int i = 2; i >= 0; i--){
rsconst1[2-i] = const1[i];
rsconst2[2-i] = const2[i];
}
이후 rsconst 배열에 각 숫자값을 역순화한 값을 넣어주었다.
if(atoi(rsconst1) > atoi(rsconst2)){
printf("%s", rsconst1);
}
else{
printf("%s", rsconst2);
}
stdlib.h의 atoi 함수를 이용하여 역순화한 문자열을 int형으로 바꾸고 이들의 크기를 비교해 더 큰 수를 출력하였다.
[백준] 별 찍기 - 7
*
***
*****
*******
*********
*******
*****
***
*
별 찍기 5,6번을 합처놓은 모습이였으며 총 9줄로 공통되는 가운데 줄은 하나로 합처진 모습이였다.
//5번
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<=a; i++){
for(int k=a; k>i; k--){
printf(" ");
}
for(int j=1; j<i*2; j++){
printf("*");
}
printf("\n");
}
return 0;
}
//6번
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<=a; i++){
for(int k=1; k<i; k++){
printf(" ");
}
for(int j=a*2; j>=i*2; j--){
printf("*");
}
printf("\n");
}
return 0;
}
둘을 합치고 5번 코드를 4번만 반복 하도록 수정하여 풀었다.
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<a; i++){
for(int k=a; k>i; k--){
printf(" ");
}
for(int j=1; j<i*2; j++){
printf("*");
}
printf("\n");
}
for(i=1; i<=a; i++){
for(int k=1; k<i; k++){
printf(" ");
}
for(int j=a*2; j>=i*2; j--){
printf("*");
}
printf("\n");
}
return 0;
}
[백준] 별 찍기 - 8
* *
** **
*** ***
**** ****
**********
**** ****
*** ***
** **
* *
1~5번째 줄 까지는 줄 수 이전과 (입력값 * 2) - 줄 수 의 위치이후에 *이 출력되어있다.
즉 5를 입력받았을때 4*10번짜리 반복문을 돌리는 동안 줄 수 보다 작거나 (입력값 * 2) - 줄 수 와크거나 같으면 *을 출력하고 나머지는 공백을 출력하면 될것이다.
for(i=1; i<a; i++){
for(int j=0; j<a*2; j++){
if(j<i || j>=(a*2)-i)
printf("*");
else
printf(" ");
}
printf("\n");
}
* *
** **
*** ***
**** ****
이로써 절반이 완성되었다.
아래는 위의 코드를 참고해서 반대로 하되 최외곽 반복문이 한번 더 돌도록 하여야한다.
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<a; i++){
for(int j=0; j<a*2; j++){
if(j<i || j>=(a*2)-i)
printf("*");
else
printf(" ");
}
printf("\n");
}
for(i=a; i>0; i--){
for(int j=0; j<a*2; j++){
if(j<i || j>=(a*2)-i)
printf("*");
else
printf(" ");
}
printf("\n");
}
return 0;
}
[백준] 별 찍기 - 9
*********
*******
*****
***
*
***
*****
*******
*********
8번 문제에서 공백과 *이 바뀐듯한 문제이다.
*과 공백을 바꿔주고 조건문 앞쪽 조건에 -1을 더해 공백을 한칸씩 없애주었다.
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<a; i++){
for(int j=0; j<a*2; j++){
if(j<i-1 || j>=(a*2)-i)
printf(" ");
else
printf("*");
}
printf("\n");
}
for(i=a; i>0; i--){
for(int j=0; j<a*2; j++){
if(j<i-1 || j>=(a*2)-i)
printf(" ");
else
printf("*");
}
printf("\n");
}
return 0;
}
하지만 이렇게 코드를 짤 경우 * 뒤에도 공백이 나오게 되는데 이를 백준에서는 오답처리 시켜 조건문의 두번째 조건을 없애고
for(int j=0; j<a*2-i; j++){
으로 for 횟수를 줄여주어 풀었다.
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<a; i++){
for(int j=0; j<a*2-i; j++){
if(j<i-1)
printf(" ");
else
printf("*");
}
printf("\n");
}
for(i=a; i>0; i--){
for(int j=0; j<a*2-i; j++){
if(j<i-1)
printf(" ");
else
printf("*");
}
printf("\n");
}
return 0;
}
[백준] 별 찍기 - 12
*
**
***
**
*
입력값 * 2 - 1 줄로 출력되고 공백은 입력값 -1 에서 하나씩 줄다 늘어나며, *은 공백 뒤에 입력값까지 늘어났다 줄어드는 모습을 보여준다.
이는 2중 for문 2*2개를 사용하여 해결 할 수 있다.
#include <stdio.h>
int main(){
int a,i;
scanf("%d", &a);
for(i=1; i<a; i++){
for(int j=a; j>i; j--)
printf(" ");
for(int j=1; j<=i; j++)
printf("*");
printf("\n");
}
for(i=1; i<=a; i++){
for(int j=1; j<i; j++)
printf(" ");
for(int j=a; j>=i; j--)
printf("*");
printf("\n");
}
return 0;
}