복대가리의 개발

[C#] 백준 (알고리즘)/브론즈 문제

[백준 - C#] 1350번 문자열

복대가리 2022. 9. 11. 09:00
728x90

문제링크

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

 

1350번: 진짜 공간

첫째 줄에 파일의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 파일의 크기가 공백을 사이에 두고 하나씩 주어진다. 파일의 크기는 1,000,000,000보다 작거나 같은 음이 아닌

www.acmicpc.net

 

문제

어떤 파일 시스템에는 디스크 공간이 파일의 사이즈와 항상 같지는 않다.
이것은 디스크가 일정한 크기의 클러스터로 나누어져 있고, 한 클러스터는 오직 한 파일만 이용할 수 있기 때문이다.

예를 들어, 클러스터의 크기가 512바이트이고, 600바이트 파일을 저장하려고 한다면, 두 개의 클러스터에 저장하게 된다. 두 클러스터는 다른 파일과 공유할 수 없기 때문에, 디스크 사용 공간은 1024바이트가 된다.

파일의 사이즈와 클러스터의 크기가 주어질 때, 사용한 디스크 공간을 출력하는 프로그램을 작성하시오.

조건

시간제한 : 2초
메모리 제한 : 128 MB

입력

첫째 줄에 파일의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에는 파일의 크기가 공백을 사이에 두고 하나씩 주어진다. 파일의 크기는 1,000,000,000보다 작거나 같은 음이 아닌 정수이다. 마지막 줄에는 클러스터의 크기가 주어진다. 이 값은 1,048,576보다 작거나 같은 자연수이다.

출력

첫째 줄에 사용한 디스크 공간을 출력한다.

 

문제정리

1. 클러스트의 공간과 파일의 사이즈는 항상 같지 않습니다.
2. 두 클러스터는 다른 파일과 공유 할 수 없습니다.
3. 총 사용한 클러스트 공간을 출력해야합니다.

이번 문제의 경우 파일 사이즈와 클러스트 사이즈가 주어지면 필요한 클러스트의 총 사이즈를 구하는 문제입니다.

일단 총사이즈를 구하기 전에 클러스트의 필요 개수를 구해야 합니다.

클러스트의 필요 개수의 경우 

(파일 크기 / 클러스트의 사이즈) + (파일의 사이즈 % 클러스트의 사이즈) 로 구하면 됩니다.

여기서 주의 할점은 파일의 크기가 0일 때와 파일 사이즈와 클러스트 사이즈를 나누었을 때 나머지가 0일 때입니다.

 

마지막으로 클러스트의 총 개수가 구해지면 총 개수 * 클러스트 사이즈를 계산해주면 답이 나오게 됩니다.

아래의 코드를 보시면 더 쉽게 파악이 되실 것 같습니다.

 

C# 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
static void Main(string[] args)
{
    //  https://bokhead.tistory.com/
    // 1350
    StreamWriter writer = new StreamWriter(Console.OpenStandardOutput());
    StreamReader reader = new StreamReader(Console.OpenStandardInput());
 
    int N = int.Parse(reader.ReadLine());
    string[] input = reader.ReadLine().Split();
    long clusterSize = int.Parse(reader.ReadLine());
    int[] size = new int[N];
 
    long count = 0;
 
    for (int i = 0; i < N; i++)
    {
        size[i] = int.Parse(input[i]);
 
        // 파일의 크기가 0이 아니라면 클러스트의 필요 개수(파일의 크기 / 클러스트 크기) 만큼 저장
        // 파일의 크기가 0이라면 0을 저장
        count += (size[i] != 0) ? size[i] / clusterSize : 0;
 
        // 위의 계산 후 남은 나머지가 있을 때 클러스트의 개수 추가
        count += (size[i] % clusterSize > 0) ? 1 : 0;
    }
 
    WriteLine(count * clusterSize);
 
    writer.Close();
    reader.Close();
}
cs
읽어주셔서 감사합니다 오늘도 즐거운 하루 되세요.

 

728x90