[기초-종합] 소리 파일 저장용량 계산하기(설명)

 

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

마이크를 통해 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의 저장공간이 필요하다.

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

**
8 bit(비트) = 1byte(바이트) // 8bit=1Byte
1024 Byte(210 byte) = 1KB(킬로 바이트) // 1024bit=1KB
1024 KB(210 KB) = 1MB(메가 바이트)
1024 MB(210 MB) = 1GB(기가 바이트)
1024 GB(210 GB) = 1TB(테라 바이트)

 

 

입력

h, b, c, s 가 공백을 두고 입력된다.
h는 48,000이하, b는 32이하(단, 8의배수), c는 5이하, s는 6,000이하의 자연수이다.

 

출력

필요한 저장 공간을 MB 단위로 바꾸어 출력한다.
단, 소수점 둘째 자리에서 반올림해 첫째 자리까지 출력하고 MB를 공백을 두고 출력한다.

 

입력 예시

44100 16 2 10

 

출력 예시

1.7 MB

 

풀이

 

h, b, c, s = map(int, input().split())

pcm = round(((h * b * c * s) / 2**23), 1)

print(pcm, "MB")

 

설명

 

문제는 긴데 맞게 한건지는 모르겠다. 일단 정답처리

4가지 숫자를 입력 받아 변수에 맞게 넣어준다.

-> 문제에서 제시한 조건에 맞게 연산을 해준다.

-> MB 단위로 출력해야 함으로 2^23으로 나누어 준다.

-> 소수점 둘째자리에서 반올림하여 첫째자리까지 출력해야하므로 round를 써주었다.

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1087  (0) 2020.01.13
Code Up 기초 100제 - 1086  (0) 2020.01.13
Code Up 기초 100제 - 1084  (0) 2020.01.13
Code Up 기초 100제 - 1083  (0) 2020.01.13
Code Up 기초 100제 - 1082  (0) 2020.01.13

[기초-종합] 빛 섞어 색 만들기(설명)

 

빨강(red), 초록(green), 파랑(blue) 빛을 섞어
여러 가지 빛의 색을 만들어 내려고 한다.

빨강(r), 초록(g), 파랑(b) 각각의 빛의 개수가 주어질 때,
(빛의 강약에 따라 0 ~ n-1 까지 n가지의 빛 색깔을 만들 수 있다.)

주어진 rgb 빛들을 다르게 섞어 만들 수 있는 모든 경우의 조합(r g b)과
총 가짓 수를 계산해보자.

 

입력

빨녹파(r, g, b) 각 빛의 강약에 따른 가짓수(0 ~ 128))가 공백을 사이에 두고 입력된다.
예를 들어, 3 3 3 은 각 색깔 빛에 대해서 그 강약에 따라 0~2까지 3가지의 색이 있음을 의미한다.

출력

만들 수 있는 rgb 색의 정보를 오름차순(계단을 올라가는 순, 12345... abcde..., 가나다라마...)으로
줄을 바꿔 모두 출력하고, 마지막에 그 개수를 출력한다.


입력 예시

2 2 2

 

출력 예시

0 0 0

0 0 1

0 1 0

0 1 1

1 0 0

1 0 1

1 1 0

1 1 1

8

 

풀이

 

red, green, blue = map(int, input().split())

for r in range(red):
    
    for g in range(green):
        
        for b in range(blue):
            
            print(r, g, b)
            
print(red * green * blue)

 

설명

 

앞에 있던 주사위 문제와 비슷하다. 주사위 문제가 for문의 2중첩이었다면 이건 3중첩

 

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1086  (0) 2020.01.13
Code Up 기초 100제 - 1085  (0) 2020.01.13
Code Up 기초 100제 - 1083  (0) 2020.01.13
Code Up 기초 100제 - 1082  (0) 2020.01.13
Code Up 기초 100제 - 1081  (0) 2020.01.13

[기초-종합] 3 6 9 게임의 왕이 되자!(설명) 

 

3 6 9 게임을 하던 영일이는 3 6 9 게임에서 잦은 실수로 계속해서 벌칙을 받게 되었다.
3 6 9 게임의 왕이 되기 위한 마스터 프로그램을 작성해 보자.

 

입력

10 보다 작은 정수 1개가 입력된다.
(1 ~ 9)

출력

1 부터 그 수까지 순서대로 공백을 두고 수를 출력하는데,
3 또는 6 또는 9인 경우 그 수 대신 영문 대문자 X 를 출력한다.


입력 예시

9

 

출력 예시

1 2 X 4 5 X 7 8 X

 

풀이

 

number = int(input())

for i in range(1, (number + 1)):
    
    if ((i == 3) or (i == 6) or (i == 9)):
        
        print("X", end = " ")
        continue
        
    print(i, end = " ")

 

설명

 

숫자를 받아줍니다.

-> for문과 if문을 활용하여 i가 3,6,9 인 경우를 필터링 해줍니다.

-> 3,6,9일 경우 X를 출력해준 뒤에 continue를 해줬습니다. continue를 해줄 경우 다시 for문의 처음으로 돌아갑니다.

-> 출력 결과가 공백을 사이에 두고 출력 되었으므로 end = " "을 추가해줬습니다.

'Algorithms > Code Up 100제' 카테고리의 다른 글

Code Up 기초 100제 - 1085  (0) 2020.01.13
Code Up 기초 100제 - 1084  (0) 2020.01.13
Code Up 기초 100제 - 1082  (0) 2020.01.13
Code Up 기초 100제 - 1081  (0) 2020.01.13
Code Up 기초 100제 - 1080  (0) 2020.01.13