정화 코딩

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

Group/EC.crew

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

jungh150c 2023. 1. 18. 19:43

1. 약수 (백준 1037번)

 

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

 

#C
#include <stdio.h>

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

    int div[n];
    for(int i = 0; i < n; i++)
        scanf("%d", &div[i]);
    
    int min = div[0], max = div[0];
    for(int i = 1; i < n; i++)
    {
        if(div[i] < min)
            min = div[i];
        if(div[i] > max)
            max = div[i];
    }

    printf("%d\n", min * max);

    return 0;
}

 

여러개의 약수 중 최솟값과 최댓값을 곱하면 원래의 수가 나온다! (정답)

 


 

2. 좌표 정렬하기 (백준 11650번)

 

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

 

(미해결)

 


 

3. 소트인사이드 (백준 1427번)

 

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

 

#C
#include <stdio.h>
#include <string.h>

void insertSort(int A[], int n) // 내림차순
{
    int i, j, key;
    for (i = 1; i < n; i++)
    {
        key = A[i];
        for (j = i-1; j >= 0 && key > A[j]; j--)
            A[j+1] = A[j];
        A[j+1] = key;
    }
}

int main()
{
    char str[12]; // 11로 하면 숫자 10개인 경우에서 오답
    int num[12];

    fgets(str, sizeof(str), stdin);
    int length = strlen(str) - 1;

    for(int i = 0; i < length; i++)
        num[i] = (int) str[i] - '0';

    insertSort(num, length);

    for(int i = 0; i < length; i++)
        printf("%d", num[i]);

    return 0;
}

 

입력은 문자열로 받고 문자열의 문자 하나하나를 숫자로 변환해서 배열로 저장해두었다. 이 때, 처음에는 문자열의 길이를 11로 하니까 자리수가 10개인 경우에 9개만 출력되었다. (오답) 왜인가 했더니 아마도 엔터까지 생각해주어야 되기 때문인 것 같다. 아무튼 10자리+엔터+널문자 이렇게 길이는 12로 선언하니 정상적으로 실행되었다. (정답)

 


 

4. 팀 이름 정하기 (백준 1296번)

 

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

 

#C
#include <stdio.h>
#include <string.h>

int main()
{
    char name[22];
    int nameL = 0, nameO = 0, nameV = 0, nameE = 0;
    scanf("%s", name);

    for(int i = 0; i < 20; i++)
    {
        if(name[i] == 'L')
            nameL++;
        if(name[i] == 'O')
            nameO++;
        if(name[i] == 'V')
            nameV++;
        if(name[i] == 'E')
            nameE++;
    }

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

    char team[n][22];
    int teamL[n], teamO[n], teamV[n], teamE[n];

    for(int i = 0; i < n; i++)
    {
        scanf("%s", team[i]);

        teamL[i] = nameL;
        teamO[i] = nameO;
        teamV[i] = nameV;
        teamE[i] = nameE;
    }
    
    for(int j = 0; j < n; j++)
        for(int i = 0; i < 20; i++)
        {
            if(team[j][i] == 'L')
                teamL[j]++;
            else if(team[j][i] == 'O')
                teamO[j]++;
            else if(team[j][i] == 'V')
                teamV[j]++;
            else if(team[j][i] == 'E')
                teamE[j]++;
            else if(team[j][i] == '\0')
                break;
        }

    int win[n];
    for(int i = 0; i < n; i++)
        win[i] = ((teamL[i]+teamO[i])*(teamL[i]+teamV[i])*(teamL[i]+teamE[i])
                 *(teamO[i]+teamV[i])*(teamO[i]+teamE[i])*(teamV[i]+teamE[i])) % 100;

    int maxindex = 0;
    for(int i = 0; i < n; i++)
        if(win[i] > win[maxindex])
            maxindex = i;
        else if(win[i] == win[maxindex] && strcmp(team[i], team[maxindex]) < 0)
            maxindex = i;

    printf("%s\n", team[maxindex]);

    return 0;
}

 

변수가 많아서 살짝 복잡하고 헷갈렸던 문제. 팀의 이름별로 우승 확률을 구하고 가장 높은 확률의 팀 이름을 출력하는 것까지는 어찌저찌 구현했다. 문제는 그 다음이었는데, 확률이 같은 경우에 사전 순으로 앞서는 팀 이름을 출력하는 것을 어떻게 해야할지 감이 안 잡혔다. 역시나 오늘도 오빠가 도와줬다. 그냥 같은 경우일 때 &&으로 문자열을 비교하는 함수인 strcmp의 조건만 추가하면 되는 거였다. 생각보다 간단... (정답)

 

'Group > EC.crew' 카테고리의 다른 글

EC.crew (3기) 4주차 정기 모임  (0) 2023.01.25
EC.crew (3기) 2주차 정기 모임  (0) 2023.01.11
EC.crew (3기) 1주차 정기 모임  (0) 2023.01.04
EC.crew (2기) 8주차 정기 모임  (3) 2022.11.17
EC.crew (2기) 4주차 정기 모임  (0) 2022.09.29
Comments