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가 출력되고 프로그램이 종료되는 것을 확인할 수 있습니다.