알고리즘/백준(BOJ) 문제풀이

[C언어 백준 풀이][Bronze II] 1350번 : 진짜 공간 / 1362번 : 펫 / 1371번 : 가장 많은 글자 (EOF 입력 방법)

restudy 2021. 8. 25. 18:12
반응형

1350번 : 진짜 공간

 

디스크 클러스터에 대한 개념 설명과 함께 나와있는 간단한 문제입니다.

파일의 크기가 클러스터 n개의 크기를 "초과"했을 때만 n+1개의 클러스터가 필요한 것이므로, 등호가 어디에 포함되는지를 잘 파악해야 합니다.

 

#include<stdio.h>

int main() {
    int n, size[1001], cluster;
    long long int count = 0;
    scanf("%d", &n);
    for(int i=0; i<n; i++) scanf("%d", &size[i]);
    scanf("%d", &cluster);
    for(int i=0; i<n; i++) {
        if(size[i]%cluster == 0) count += size[i]/cluster;
        else count += size[i]/cluster + 1;
    }
    printf("%lld", count*(long long int)cluster);
}

 

풀이로 가능한 코드로는 위와 같은 예시가 있습니다.

파일의 크기는 10억 이하라고 하였으므로 int 형으로 충분히 나타낼 수 있으나, 마지막에 출력되는 총 클러스터 용량의 크기는 21억을 넘어갈 수 있으므로 long long int를 사용해주어야 합니다.

그리고 가장 중요한 것이 count(클러스터의 수)인데, 파일의 용량 10억 * 최대 갯수 1000을 했을 때 클러스터의 크기가 500보다 작다면 count 또한 21억을 초과하게 되므로 count에도 long long을 적용해주어야 합니다.

(물론 이러한 데이터 범위의 고려가 힘들다면 모든 변수에 long long int를 써줘도 됩니다.)

 

 

1362번 : 펫

 

펫에게 E와 F로 운동 또는 먹이를 선택하여 펫의 상태를 변화시키고, 일련의 명령어 이후 펫의 상태를 출력하는 문제입니다.

펫이 중간에 죽는 경우만 제외하면 나머지 예외는 고려하지 않아도 될 것 같습니다.

 

#include<stdio.h>

int main() {
    float o, w, n;
    char c;
    int isRIP;
    for(int i=1; ; i++) {
        isRIP = 0;
        scanf("%f %f", &o, &w);
        if(o == 0 && w == 0) return 0;
        while(1) {
            scanf("%c %f", &c, &n);
            if(c == '#' && n == 0) {
                printf("%d ", i);
                if(isRIP) printf("RIP\n");
                else if(w > 0.5*o && w < 2*o) printf(":-)\n");
                else printf(":-(\n");
                break;
            }
            else if(c == 'E') {
                if(w-n <= 0) isRIP = 1;
                w -= n;
            }
            else if(c == 'F') w += n;
        }
    }
}

 

정답률 26%에 맞은 사람이 100명대이길래 코드를 일부러 난잡해도 안전하게 짰는데, 정답률에 비해 그렇게 어려운 문제는 아닌 것 같습니다.

우선 각 시나리오에 대해서도 반복문을 돌려야 하므로 이중 반복문의 설계가 필요합니다.

그 다음 RIP를 중간에 바로 출력해버리면 프로그램이 오답으로 처리할 수 있기 때문에 안전하게 isRIP라는 체크 포인트를 만들어서 "# 0"으로 입력이 끝나면 마지막에 결과를 출력해줄 수 있도록 합시다.

그 다음 체중의 경우 0.5배를 계산하기 위해서는 실수가 필요하기 때문에 float 형을 사용해주고, 초과/이상과 미만/이하의 차이를 잘 구별하여 부등호를 사용해주면 틀릴 부분이 없습니다.

 

 

1371번 : 가장 많은 글자

 

주어진 입력에서 빈도수가 가장 높은 알파벳을 출력하는 간단한 문제입니다.

빈도수가 동률일 경우 빈도수가 같은 여러 알파벳을 알파벳 순서로 출력합니다.

이 문제에서는 문자열 중간에 "\n"도 포함되어 있다는 것이 유일하게 처리하기 까다로운 부분입니다.

 

#include<stdio.h>

int main() {
    char c;
    int freq[26] = {0, }, max = 0;
    while(scanf("%c", &c) != EOF) if(c >= 'a' && c <= 'z') freq[c - 'a']++;
    for(int i=0; i<26; i++) if(freq[i] > max) max = freq[i];
    for(int i=0; i<26; i++) if(freq[i] == max) printf("%c", 'a' + i);
}

 

저의 경우에는 EOF를 이용하여 입력의 종료를 처리하기로 했습니다.

EOF는 end of file의 약자로 파일(여기서는 입력)이 끝났다는 뜻입니다.

개발 환경 콘솔 창에서 EOF를 입력하는 방법은 ctrl + Z의 커맨드를 입력해주는 방법이 있습니다.

 

 

ctrl + Z를 입력하면 위와 같이 "^Z"가 출력되는데 이것이 EOF를 입력했다는 표시입니다.

여기서 엔터를 한 번 더 눌러주면 파일의 입력이 종료되며 가장 빈도가 높은 e가 출력되고 프로그램이 종료되는 것을 확인할 수 있습니다.

 

 

 

 

반응형