Group/EC.crew

EC.crew (3기) 4주차 정기 모임

jungh150c 2023. 1. 25. 18:53

1. 잃어버린 괄호 (백준 1541번)

 

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

 

//C
#include <stdio.h>

int main()
{
    char str[60];
    int num[30];
    char oper[30];

    scanf("%s", &str);

    return 0;
}
//C
// 이건 토큰 분리 말고 다른 방식으로 입력 받는 방법 중 하나!
// 파일이 끝날 때까지 정수를 입력받고, 정수를 입력받으면 부호까지 같이 들어오니까 바꿔줘야 하는데
// 바꿔줄 때 문자열에 +, -도 넣어주기!
// (오빠가 알려준 방법.. ㅎ)
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>

// 문자열 토큰 분리 (문자열 처리 라이브러리 예제)

#define N 100

int i[50];

int main()
{
    for (int j = 0; ; j++) {
        if (scanf("%d", i+j) == EOF) {
            i[j] = INT_MAX;
            break;
        } else {
            if (i[j] < 0) {
                i[j] = -i[j];
                // 여기에서 문자열에 + 또는 - 추가하면 될듯!
            }
        }
    }
    
    char str[N];
    char seps[] = "+-";
    char *token;
    
    fgets(str, sizeof(str), stdin);
    
    token = strtok(str, seps);  // 첫번째 단어 자름.
    
    while(token != NULL)
    {
        puts(token);
        token = strtok(NULL, seps);  // 잘려진 위치를 기준으로 뒷부분 중에서 분리자로 또 자름.
    }
    
    return 0;
}

 

(미해결)

 


 

2. 설탕 배달 (백준 2839번)

 

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

 

//C
#include <stdio.h>

int main()
{
    int n;
    scanf("%d", &n);

    int nby5 = n / 5, nby3 = 0;
    int num5, num3;
    int possible = 0;

    for (int i = nby5; i >= 0; i--)
    {
        nby3 = n - 5*i;

        if (nby3 % 3 == 0)
        {
            possible = 1;
            num5 = i;
            num3 = nby3 / 3;
            break;
        }
    }

    if (possible == 1)
    {
        printf("%d\n", num5 + num3);
        return 0;
    }
    else
    {
        printf("-1\n");
        return 0;
    }

    return 0;
}

 

n을 5로 나눈 몫을 nby5에 저장한다. (n - 5*i)가 3으로 나누어 떨어지는지 확인하는 과정을 i를 nby5부터 하나씩 줄여가면서 반복한다. i가 클 때부터 줄여가면서 반복하는 이유는, 그렇게 해야 봉지의 수가 최소인 경우이기 때문이다. 나누어 떨어지면 그 때 5kg짜리 봉지의 수와 3kg짜리 봉지의 수를 합하여 출력하면 된다. 다 돌아도 그런 경우가 없다면 정확하게 n을 만들 수가 없다는 뜻이므로 -1을 출력한다. (정답)

 


 

3. ATM (백준 11399번)

 

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

 

//C
#include <stdio.h>
#include <stdlib.h>

int compare(const void* _elem1, const void* _elem2)
{
	int* elem1 = (int*)_elem1;
	int* elem2 = (int*)_elem2;

	if (*elem1 > *elem2)
		return 1;
	else if (*elem1 < *elem2)
		return -1;
	else
		return 0;
}

int main()
{
    int n, p[1000];
    long long sum = 0;
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
        scanf("%d", &p[i]);

    qsort((void*)p, n, sizeof(int), compare);

    for (int i = 0; i < n; i++)
        sum += (n-i) * p[i];
    
    printf("%lld\n", sum);

    return 0;
}

 

처음에는 sum의 자료형을 int로 둬서 틀렸다. (오답) sum은 n이 1000이고 모든 p가 1000일 때 int가 표현할 수 있는 범위를 넘어갈 수 있으므로, int보다 더 큰 수를 표현할 수 있는 자료형인 long long을 써야한다. 자주하는 실수... 범위 잘 보자. 그리고 long long의 형식지정자는 lld이다! (정답)