Algorithm/[Python] Code Up_basic100

[ 6084 ] 코드업 6084 : 소리 파일 저장용량 계산하기

내일은개발천재🎵 2021. 4. 10. 22:56

< 코드 >

h, b, c, s = map(int, input().split())
print ('%.1f'%(h*b*c*s/8/1024/1024), 'MB')

 

< 문제 >

소리가 컴퓨터에 저장될 때에는 디지털 데이터화 되어 저장된다. 

마이크를 통해 1초에 적게는 수십 번, 많게는 수만 번 소리의 강약을 체크하고,
한 번씩 체크할 때 마다 그 값을 정수값으로 바꾸어 저장하는 방식으로 소리를 파일로 저장할 수 있다.

값을 저장할 때에는 비트를 사용하는 정도에 따라 세세한 녹음 정도를 결정할 수 있고,
좌우(스테레오) 채널로 저장하면 2배… 5.1채널이면 6배의 저장공간이 필요하고,
녹음 시간이 길면 그 만큼 더 많은 저장공간이 필요하다.

1초 동안 마이크로 소리강약을 체크하는 횟수를 h
(헤르쯔, Hz 는 1초에 몇 번? 체크하는가를 의미한다.)

한 번 체크한 값을 저장할 때 사용하는 비트수를 b
(2비트를 사용하면 0 또는 1 두 가지, 16비트를 사용하면 65536가지..)

좌우 등 소리를 저장할 트랙 개수인 채널 개수를 c
(모노는 1개, 스테레오는 2개의 트랙으로 저장함을 의미한다.)

녹음할 시간(초) s가 주어질 때,

필요한 저장 용량을 계산하는 프로그램을 작성해보자.

실제로, 일반적인 CD 음질(44.1KHz, 16bit, 스테레오)로 1초 동안 저장하려면
44100 * 16 * 2 * 1 bit의 저장공간이 필요한데, 
44100*16*2*1/8/1024/1024 로 계산하면 약 0.168 MB 정도가 필요하다. 

이렇게 녹음하는 방식을 PCM(Pulse Code Modulation) 방법이라고 하는데,
압축하지 않은 순수한(raw) 소리 데이터 파일은 대표적으로 *.wav 가 있다.

 

< 접근 방법 > 

  - 문제가 너무 길어서, 문제 이해 방법을 설명하고자 한다. 우선 문제를 풀며 필요한 단서들을 BOLD 체로 표시해보았다.

     => 강약 체크 = h, 저장 비트 수 = b, 트랙 개수 = c. 녹음 시간 = s

     => 저장용량은 강약 체크한 수, 채널, 비트 사용 개수, 녹음시간에 비례한다. ( 형광펜 확인 )

  - 문제를 풀기 위해 bit를 MB(메가바이트)로 바꾸어야 한다는 것을 알 수 있다. (Bit => MB)

 

 < 문제 풀이 > 

   - 저장용량 = h * b * c * s 을 구한 후, Bit 단위를 MB(메가 바이트)로 변환한다.

   - 우선, h * b * c * s 를 x 라고 생각해보면 쉽다.

     => x 는 Bit 로 표현된 수이다. 이를 Byte 로 나타내기 위해 8로 나누어준다. ( 8 bit = 1Byte 이므로 )

      => x/8 은 Byte로 표현된 수 이다. 이를 KB(킬로 바이트)로 나타내주기 위해 1024로 나누어준다. ( 1024Byte = 1KB 이므로 )

      = KB로 나타낸 x를 MB로 나타내기 위해 1024로 다시 나누어준다. ( 1024 KB = 1MB 이므로 )

   ✏️ 요약하면 다음과 같다.

      Bit 단위 저장용량 =  h * b * c * s 

      Byte 단위 저장용량 =   h * b * c * s  / 8

      KB 단위 저장용량 =   h * b * c * s  / 8  / 1024

      MB 단위 저장용량 =   h * b * c * s  / 8  / 1024  / 1024