C언어: 1일차 (while문~1차원 배열)

이미리·2021년 8월 7일
0

boj_Algorithm

목록 보기
2/25

10951번

#include <stdio.h>
int main(){
    int i = 1;
    int j = 1;
    while (1) {
        scanf("%d %d", &i, &j);
        if (i <0 || j > 10)break;
        printf("%d\n", i + j);
    }
    return 0;
}

if문을 이용해서 범위 외의 값이 들어오면 break가 되도록 하였다.
하지만 출력초과...
찾아보니 EOF라는 새로운 개념이 들어있었다.

#include <stdio.h>
int main(){
    int i = 1;
    int j = 1;
    while (scanf("%d %d", &i, &j)!=EOF){
        printf("%d\n", i + j);
    }
    return 0;
}

EOF ==> end of file이라는 뜻으로 파일의 끝에 도달할 때까지 while문을 실행한다는 것이다.
이 조건을 써주지 않으면 scanf가 무한 루프를 돌아 메모리 할당 범위를 초과한다.


1110번

#include <stdio.h>
int main() {
    int a, b, t, n;
    int result = 0;
    scanf("%d", &t);
    while (t!=n) {
        a = t / 10;
        b = t % 10;
        n = b * 10 + (a + b) % 10;
        result += 1;
    }
    printf("%d", result);
    return 0;
}

음 왜 while문에 조건을 넣고 돌리면 틀리고, True&if문을 써야 맞는지 알려주실분..? ㅠㅠ 나로써는 도저히 이해가 안된다.. 논리에 맞지 않는가??
나만의 착각인건가.
C언어 뉴비는 운다. 어쨌든 if문으로 다시 고쳐서 돌려보자.

#include <stdio.h>
int main() {
    int a, b, t;
    int n = 1;
    int result = 0;
    scanf("%d", &t);
    while (1) {
        a = t / 10;
        b = t % 10;
        n = b * 10 + (a + b) % 10;
        result += 1;
        if (n == t)break;
    }
    printf("%d", result);
    return 0;
}

하... 왜 안되는거지. if문으로 바꿨는데도 안된다.
뭐야

해결햇다. 현재 위 코드에서 n의 흐름을 따라가보자. n이 들어가서 새로운 n 값이 할당되어야하는데 t로 이루어진 코드로 인해 n이 업데이트되고 있지 않다.
따라서 t를 n에 할당해주고, while문 내의 t를 n으로 변경해준다.

#include <stdio.h>
int main() {
    int a, b, t, n;
    int result = 0;
    scanf("%d", &t);
    n = t;
    while (1) {
        a = t / 10;
        b = t % 10;
        t = b * 10 + (a + b) % 10;
        result += 1;
        if (n == t)break;
    }
    printf("%d", result);
    return 0;
}

2562번

#include <stdio.h>
int main() {
    int a, b, num;
    int count = 1;
    scanf("%d", &a);
    num = a;
    for (int i=0; i < 9; i++) {
        scanf("%d", &b);
        if (num <= b) {
            num = b;
            count++;
        }else { count++; }
    }
    printf("%d", count);
    return 0;
}

아까의 문제와 같은 값이 들어올 때마다 max값을 변환하는 것이 아니다.
왜냐면 계속 값이 업데이트되면 count값이 9로 끝남...낄낄

그래서 배열을 만들어 값을 넣어야한다.

#include <stdio.h>
int main() {
    int arr[9];
    int max;
    int count = 0;
    for (int i = 0; i < 9; i++) {
        scanf("%d", &arr[i]);
    }
    max = arr[0];
    for (int i = 0; i < 9; i++) {
        if (max < arr[i]) {
            max = arr[i];
            count = i;
        }
    }
    printf("%d\n%d", max, count + 1);
    return 0;
}

2577번

#include <stdio.h>
int main() {
    int a[3];
    for (int i = 0; i < 3; i++) {
        scanf("%d", &a[i]);
    }
    int num = a[0] * a[1] * a[2];
    //세 수의 곱을 만들어줌
    //세 수의 곱을 문자열로 변환하고 싶음.
    return 0;
}

세수의 곱을 문자열로 변환하고 싶은데 녹록치가 않다.
아무래도 파이썬은 내장함수가 있어서 편했는데, C언어는 그렇지가 않다.

//보다 간단하게 곱을 만들 수 있다.
#include <stdio.h>

int main() {
    int a, b, c;
    int arr[10] = {0, };
    scanf("%d %d %d", &a, &b, &c);
    int n = a*b*c;

여기까지가 곱을 만드는 과정이다.

   int num;
   while(n>0) { //예시 123
        num = n%10; //123%10=3
        arr[num]++; //arr[3]++
        n /= 10; //123/10=12 --> n은 12가 되어 다시 while으로 돌아간다.
    }
     for(int i=0; i<10; i++) {
        printf("%d\n", arr[i]);  //출력
    }
    
    return 0;
}

이걸 어케 생각해...한번 해보는데까지 해봐야겠다...


3052번

#include <stdio.h>

int main() {
    int arr[10] = { 0, };
    for (int i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
        arr[i] %= 42;
    }
    //배열을 통해서 42이를 나눈 나머지를 arr에 넣었다.
    
    int a[42] = { 0, };
    for (int i = 0; i < 10; i++) {
        int num = arr[i];
        a[num]++;
    }
    //나머지가 존재하면 나머지의 자리에 1++된다.    
	//예시 --> 0이 존재 a[0]++ 되어 a[0]=1이 된다.
    
    int count = 0;
    for (int i = 0; i < 42; i++) {
        if (a[i] != 0) {
            count++;
        }
    }
    //a에 들어있는 요소를 세어준다. 대신 0을 빼야한다.
    printf("%d",count);
    return 0;
}

한번에 성공했지만 더 간단한 방법이 있을 것 같다.

이중 for문을 이용해서 중복을 제거하는 방법을 찾았다.
내가 길게 늘여쓴 두개의 for문을 겹친것과 다름없다.

for(int i=0; i<10; i++) {
        int count=0; // 초기화
        for(int j=i+1; j<10; j++) { // 서로 같은 수일 경우
            if(remain[i] == remain[j]) count++;
        }
        if (count == 0) result++; // 같은 수가 없을 경우 개수를 세준다
    }

1546번

#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int arr[1000];
    for (int i = 0; i < n; i++) {
        scanf("%d",&arr[i]);
    }
    // scanf로 인수를 받을 때 띄어쓰기를 통해서 구분하고 싶다. 어떻게 해야할까.
    
    int max = arr[0];
    for (int i = 0; i < n; i++) {
        if (max < arr[i]) {
            max = arr[i];
        }
    }
    for (int i = 0; i < n; i++) {
        arr[i] = arr[i] / max * 100;
    }
    int sum=0;
    for (int i = 0; i < n; i++) {
        sum += arr[i];
    }
    printf("%f", sum / n);
    return 0;
}

arr 내부의 값이 소수가 될 수도 있기 때문에 double형 배열로 바꿔준다.
또 max를 찾아내는 for문을 위의 것과 합쳐 하나로 만들어준다. --> 시간이 절약됨.

int main() {
    int n, max=0;
    scanf("%d", &n);
    double arr[1000];
    for (int i = 0; i < n; i++) {
        scanf("%d",&arr[i]);
        if (max < arr[i]) {
            max = arr[i];
        }
    }

%d(int)로 작성되어 있는 것들을 자료형과 맞게 %lf(double)로 고쳐준다.
아래의 max를 구하는 for문과 sum을 구하는 for문도 합쳐줄 수 있다.

#include <stdio.h>

int main() {
    int n;
    double arr[1000], max = 0, sum = 0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%lf", &arr[i]);
        if (max < arr[i]) {
            max = arr[i];
        }
    }
    for (int i = 0; i < n; i++) {
        arr[i] = arr[i] / max * 100;
        sum += arr[i];
    }
    
    printf("%lf", sum/(double)n);
    return 0;
}

0개의 댓글

관련 채용 정보