728x90

 이 문제는 할로윈의 사탕으로

사탕을 나누어 주는 것과 관련된 문제입니다.

문제 링크는

https://www.acmicpc.net/problem/10178

 

10178번: 할로윈의 사탕

할로윈데이에 한신이네는 아부지가 사탕을 나눠주신다. 하지만 한신이의 형제들은 서로 사이가 좋지않아 서른이 넘어서도 사탕을 공정하게 나누어 주지 않으면 서로 싸움이 난다. 매년 할로윈

www.acmicpc.net

이것이고 여기서 구하고자 하는 것은 각 개인과 아부지에게 나눠지는 것입닌다.

#include <stdio.h>
int main(void){
    int test;
    scanf("%d", &test);
    int total, many;
    int divyou[test];
    int divdad[test];
    for(int i=0;i<test;i++){
        scanf("%d %d", &total, &many);
        divyou[i]=total/many;
        divdad[i]=total%many;
    }
    for(int i=0;i<test;i++){
        printf("You get %d piece(s) and your dad gets %d piece(s).\n", divyou[i],divdad[i]);
    } 
      
}

이렇게 코드를 짤 수있습니다.

가독성을 위해 변수를 줄별로 만들었지만

줄일 수도 있습니다.

일단 테스트 갯수를 받고 

그만큼 for문을 돌려주면 됩니다.

 

for문안에서 전체 갯수와 형제의 수를 받은다음에

그리고 total에서 many로 나누어줍니다.

여기서 저는 배열을 사용하였는데

각 케이스마다 출력하는 문제가 아니라 나중에 한번에 출력하기 때문입니다.

 

이렇게 값을 추가한 뒤에 출력에서도 for문을 돌려가면서 각 배열에 저장되어있는 값을

지정 문장과 함께 출력하면 됩니다.

 

이 문제는 조금 생각해서 코드를 짜면

쉽게 풀어지는 문제라고 생각이 들었습니다.

728x90
728x90

이 문제는 별찍기입니다.

별찍기는 프로그래밍 언어를 배운다면 한번쯤 꼭 하게 되는

문제이고 여기서는 별갯수를 대칭으로 만드는 것이

고민하게 만드는 문제입니다.

먼저 문제 링크입니다.

https://www.acmicpc.net/problem/2445

 

2445번: 별 찍기 - 8

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

<코드1>

#include <stdio.h>
int main(void) {
    int a;
    int i = 0; 
    int j = 0;

    scanf("%d", &a);
    int l = a-2;
    int m = 0;
    for(i=1;i<a+1;i++) {
        for (j = 0; j < i;j++) {
            printf("*");
        }
        for (int k = l; k>=0;k--) {
            printf(" ");
        }
        for (int k = l; k >= 0; k--) {
            printf(" ");
        }
        for (j = 0; j < i; j++) {
            printf("*");
        }
        printf("\n");
        l--;
    }
    for (i = a - 1; i >= 0; i--) {
        for (j = i - 1; j >= 0; j--) {
            printf("*");
        }
        for (int k = 0; k <= m; k++) {
            printf(" ");
        }
        for (int k = 0; k <= m; k++) {
            printf(" ");
        }
        for (j = i - 1; j >= 0; j--) {
            printf("*");
        }
        printf("\n");
        m++;
    }
}

첫번째로 짠 것은 단순히 정리하지 않고 순수히

정렬을 했을 때 만들어지는 모양입니다.

 

갯수가 늘어나면 ++를 이용하였고

줄어들면 --를 이용하여 출력흘 하였습니다.

그리고 해주는 과정 안에서도 계속 l,m을 늘려주어야 하기 때문에

별도로 늘려주는 값을 넣었습니다.

 

<코드2>

#include <stdio.h>
int main(void){
    int N;
    scanf("%d", &N);
    
    for(int row=1;row<=N;row++){
        for(int star=0;star<row;star++) 
            printf("*");
        for(int blank=0;blank<(N-row)*2;blank ++) 
            printf(" ");
        for(int star=0;star<row;star++) 
            printf("*");
        
        printf("\n");
    }
    for(int row=1;row<N;row++){
        for(int star=0;star<(N-row);star++) 
            printf("*");
        for(int blank=0; blank<(row*2);blank++) 
            printf(" ");
        for(int star=0;star<(N-row);star++) 
            printf("*");
        
        printf("\n");
    }
    return 0;
}

2번째로 한것은 훨씬 깔끔한 코드입니다.

여기서는 빈칸 부분을 다듬었다고 할 수 있습니다.

N-row, row*2를 이용해 --라는 거꾸로 만드는 것을

더욱 편하게 만들어 줄 수 있습니다. 

그리고 두번 빈칸 반복되는 것을 *2라는 것을 통해

줄일 수 있습니다.

 

 

 

728x90
728x90
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int a, sum = 0;
    scanf_s("%d", &a);
    char* num = (char*)malloc(sizeof(char) * a);
    for (int i=a; i >= 0; i--) {
        scanf_s("%c", &num[i]);
    }
    for (int i = a - 1; i >= 0; i--) {
        sum += (int)num[i] - 48;
    }
    printf("%d", sum);
}

이 문제는 솔직히 100%이해를 하지 못했다.

일단 아는데까지 정래해보다 보면 무언가 알게되겠지

일단 숫자 입력받는 것은 쉬우니까

그리고 메모리 할당을 해주더라??

문자열로 변환시켜서 배열넣어서 그런듯

그 다음에는 거꾸로 배열을 저장시키던데...

이 이유는 모르겠지만 반대로 하면 다른 값이 나온다.

그러므로 거꾸로 할 수 밖에 없을 것 같고....

 

배열로 저장해야 차례대로 더해주기가 쉬우니까

그리고 a-1을 해서 다시 for문이 들어간다.

이유는 모르겠지만 같이 a-1을 하면 -24가 나오니

똑바로 나오기 위해 그런듯??

 

그리고 sum해주면서 -48을 한다.

문자열인 아스키코드는 기존 숫자에 +48을 해주니

정수형을 위해 빼주는 것으로 보인다.

 

그리고 합을 출력하면된다.

다시 한번 풀어봐야 할 것 같다.

몇가지 이해 안 되는 부분이 존재한다.

 

https://www.acmicpc.net/problem/11720

 

11720번: 숫자의 합

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백없이 주어진다.

www.acmicpc.net

 

728x90

+ Recent posts