카테고리 없음

[L01]Layer7 H.W.

dpp07 2023. 4. 3. 22:27

[백준] 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;
}