728x90
문제설명

수열 속에 숨어 있는 보물들을 찾아보자. nn개의 자연수로 이루어진 수열이 있다.

이 수열들 중 연속된 11개 이상의 원소들의 합이 정확히 kk가 되면 이 구간은 보물구간이라고 한다.

주어진 nn개의 자연수 중에서 보물 구간이 몇 개 있는지 구하는 프로그램을 작성하시오.

 

 

입력

첫 번째 줄에 자연수 nn kk가 공백으로 구분되어 입력된다.

두 번째 줄에 nn개의 각 원소가 공백으로 구분되어 입력된다.

[입력값의 정의역]

5<=n<=100,0005<=n<=100,000

각 원소는 1,0001,000이하의 자연수

 

 

출력

보물 구간의 수를 출력한다.

 

 

입력 예시

5 15

1 2 3 4 5

 

 

출력 예시

1


#include <stdio.h>
int main(void){
    int n,k;
    int temp,count=0,arr[100000];
    scanf("%d %d", &n, &k);
    for(int i=0;i<n;i++){
        scanf("%d",&arr[i]);
    }
    for(int i=0;i<n;i++){
        if(arr[i]>k) continue;
        temp=arr[i];
        if(arr[i]==k){
            count++;
            continue;
        }
        else{
            for(int j=i+1;j<n;j++){
                temp+=arr[j];
                if(temp>k) break;
                else if(temp==k){
                    count++;
                    break;
                }
            }
        }
    }
    printf("%d", count);
    return 0;
}

이건 배열로 풀어야 할지 기본 형태로 풀 수 있을지 고민하게 만들었다. 결과적으로는 배열이 가장 적당하다는 것!

이 이유는 바로 누적했다가 없애야 하는 과정이 있기 때문이다. 일반적으로 변수를 선언해 하면 이전 값으로 돌아갈 수 없다. 그렇기에 할 수 없다는 결론이 나오게 되었다. 값을 입력받아 저장하는 것까지는 많이 어렵지는 않다. 이제 count하는 과정이 중요한 것 같다. temp로 저장하는 것이 필요한데 그 이요는 기존 값을 변화시킬 수 없기 때문이다. 그래서 arr[i] 값이 크지 않는 이상 값 변화를 위해 temp로 저장해 준다.

그 다음에 같으면 count 해주는 것은 크게 어렵지 않다. else문도 조금 낮설다. j 값으로 하는데  이것을 이용해서 i 값을 다시 탐색해 해 주어야 한다. 기존에 누적하는 과정도 반복하고 그 안에서 다시 temp를 이용해 판단해주기 때문이다.

만약 값이 초과되면 중단되고 또다시 다른 탐색을 해줘야 하고, 같으면 count를 해서 마지막으로 출력해주면 된다.

728x90
728x90
문제설명

왼쪽 같이 둥근 케잌을 22번의 칼질로 케잌을 나누려고 한다.

오른쪽 그림과 같이 케익의 둘레에 시계방향으로 1 1001 100까지 일정한 간격으로 번호가 부여되어 있다. 

                 

칼로 자르려고 하는 부분은 22개의 정수로 표현한다. 이 22번의 칼질로 44조각의 케잌을 만들려면 반드시 교차하는 부분이 생긴다. 

칼로 자르려는 부분이 두 군데 주어질 때 칼로 잘리는 부분이 44조각이 되는지 판단하는 프로그램을 작성하시오.

즉, 교차하는지 유무를 판단하시오. 아래 예는 1212 5353 9999 4545를 자른 예를 나타낸다.

 

 

 

입력

첫 번째 줄에는 첫 번째 현의 정보를 나타내는 두 정수 a, b

두 번째 줄에는 두 번째 현의 정보를 나타내는 두 정수 c, d가 입력된다.

(1<=a,b,c,d<=100: a,b,c,d는 모두 다르다.)

 

 

출력

주어진 두 잘린 부분이 교차한다면 "cross", 교차하지 않는다면 "not cross"를 출력한다.

 

 

입력예시

12 53

99 45

 

 

 

출력예시

cross

 

 


#include <stdio.h>
int main(void){
    int a,b,c,d,temp;
    scanf("%d %d", &a, &b);
    scanf("%d %d", &c, &d);
    if(a>b){
        temp=a;
        a=b;
        b=temp;
    }
    if(c>d){
        temp=c;
        c=d;
        d=temp;
    }
    if(c>a&&c<b){
        if(d<a||d>b){
            printf("cross");
        }
        else{
            printf("not cross");
        }
    }
    else if(d>a&&d<b){
        if(c<a||c>b){
            printf("cross");
        }
        else{
            printf("not cross");
        }
    }
    else{
        printf("not cross");
    }
}

이 문제를 처음 보았을 때 굉장히 당황했다. 그리고 예시에 있는 것들을 만족시키는 것들을 간단하게 만들었다. 하나는 50보다 작고 하나는 50보다 클때 cross라는 식을 작성했는데 그것이 아니였다. 이것이 되지 않는 이유는 극단적인 값이 나올 때 만족시키지 못하기 때문이다. codeup은 오류 예시가 나와서 확인을 해보았는데 1 100 2 90 일 때 걸렸다. 그럼 여기서는 교차가 되지 않고 각각이 만들어지게 된다. 이를 해결하는 방법을 검색을 통해 찾아내었다.

그것은 바로 c나 d 중 하나가 a와 b 사이에 있고 다른 하나는 그 밖에 있어야 한다는 것이다. 나는 이것을 or로 묶어주었다. 그러면 동시에 만족시킬 일은 없지만 하나 이상 만족시키면 if문에 해당이 되므로 성립이 되게 된다. 이 안에서도 성립 안될 경우를 대비해 not cross 문이 나오도록 만들어주어야 한다.

앞부분 크기 판단은 굳이 필요없을 것 같다. 이것은 첨에 내가 만들어 낸 식을 만족시키기 위한 식이 때문이다. 어쨌든 이렇게 만들어내면 맞다고 나오게 된다.

728x90
728x90
문제설명

주어진 화단 둘레의 길이를 이용하여 삼각형 모양의 화단을 만들려고 한다. 이 때 만들어진 삼각형 화단 둘레의 길이는 반드시 주어진 화단 둘레의 길이와 같아야 한다. 또한, 화단 둘레의 길이와 각 변의 길이는 자연수이다.

예를 들어, 만들고자 하는 화단 둘레의 길이가 9m라고 하면

 

한 변의 길이가 1m, 두 변의 길이가 4m인 화단,

한 변의 길이가 2m, 다른 변의 길이가 3m, 나머지 변의 길이가 4m인 화단,

세 변의 길이가 모두 3m 3가지 경우의 화단을 만들 수 있다.

화단 둘레의 길이를 입력받아서 만들 수 있는 서로 다른 화단의 수를 구하는 프로그램을 작성하시오.

 

 

입력

화단의 길이 이 주어진다.(, 3 <= n <= 100)

 

 

출력

n으로 만들 수 있는 서로 다른 화단의 수를 출력한다.

 

 

입력예시

9

 

출력예시

3

 

 


#include <stdio.h>
int main(void){
    int n,count=0;
    scanf("%d", &n);
    for(int i=1;i<n;i++){
        for(int j=i;j<n;j++){
            for(int k=j;k<n;k++){
                if(i<=j&&i+j>k&&i+j+k==n){
                    count+=1;
                }
            }
        }
    }
    printf("%d", count);
}

형태를 만들고 조금 고민을 하였다. 3개의 변이니 for문 3중으로 되어야 하는 것을 이해하였기 때문이다. 근데 if문을 잘못 만들었었다. 어떤 문제였냐면 조건이 적었다는 것이다. 삼각형의 성질을 집어 넣지 않았다. 단지 세변을 더한 값이 설정값과 같아야지만 생각을 하였다. 여기서 내가 놓친 것은 i값이 j값 보다 작거나 같아야 한다는 것, 그리고 i+j값이 k 값보다 작아야 한다는 것이다. 이것은 삼각형의 성질에 나올 것이다. 이것을 &&로 묶어준다. 이 조건이 만족하게 되면 count를 해주면 되고 이를 for문을 마무리 한 뒤에 count 값을 출력을 해주면 될 것이다.

728x90

+ Recent posts