22일차 문제

양진혁·2021년 11월 22일
0

문제풀이

첫번째 문제
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.

예제 입력 1
2
3 ABC
5 /HTP

예제 출력 1
AAABBBCCC
/////HHHHHTTTTTPPPPP

n = int(input())
for i in range(n):
  el = []
  a,b = map(str, input().split())
  b  = list(b)
  for j in range(len(b)):
    el.append(str(b[j]*int(a)))
  print("".join(el))

a,b를 str로 받은 후 b는 list형태로 취한 뒤 for문을 통해서 int(a)의 숫자만큼 새로운 리스트에 넣어준 후 join함수를 통해서 프린트 해 주었다.

두번째 문제
월드전자는 노트북을 제조하고 판매하는 회사이다. 노트북 판매 대수에 상관없이 매년 임대료, 재산세, 보험료, 급여 등 A만원의 고정 비용이 들며, 한 대의 노트북을 생산하는 데에는 재료비와 인건비 등 총 B만원의 가변 비용이 든다고 한다.

예를 들어 A=1,000, B=70이라고 하자. 이 경우 노트북을 한 대 생산하는 데는 총 1,070만원이 들며, 열 대 생산하는 데는 총 1,700만원이 든다.

노트북 가격이 C만원으로 책정되었다고 한다. 일반적으로 생산 대수를 늘려 가다 보면 어느 순간 총 수입(판매비용)이 총 비용(=고정비용+가변비용)보다 많아지게 된다. 최초로 총 수입이 총 비용보다 많아져 이익이 발생하는 지점을 손익분기점(BREAK-EVEN POINT)이라고 한다.

A, B, C가 주어졌을 때, 손익분기점을 구하는 프로그램을 작성하시오.

예제 입력 1
1000 70 170

예제 출력 1
11

a,b,c  = map(int,input().split())
income = c-b
if c <=b:
    print(-1)
else :
  print(a//income +1)

만약 노트북 비용이 가변비보다 저렴하거나 비싸면 손익분기점을 넘길 수 없기에 -1을 리턴하게 했다. 그 외의 경우에는 수익으로 고정비용을 나누어서 그 몫만큼에다 1대를 더 팔아 손익분기점을 구했다.

세번째 문제
땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터인 나무 막대를 올라갈 것이다.

달팽이는 낮에 A미터 올라갈 수 있다. 하지만, 밤에 잠을 자는 동안 B미터 미끄러진다. 또, 정상에 올라간 후에는 미끄러지지 않는다.

달팽이가 나무 막대를 모두 올라가려면, 며칠이 걸리는지 구하는 프로그램을 작성하시오.

예제 입력 1
2 1 5

예제 출력 1
4

import math
a,b,c = map(int, input().split())
if a ==c:
  print(1)
else:
  print(math.ceil((c-a)/(a-b))+1)

정상에 올라가면 미끄러지지 않기 때문에 c-a를 가야하는 거리로, 그리고 가는 거리에서 미끄러지는 거리를 뺀 후 나눠주고 거기에다가 마지막 날에 가는 횟수 1을 더해준다.

네번째 문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

  a = int(input())
b = list(map(int,input().split()))
r = 0
for i in b:
  count = 0
  for j in range(2, i+1):
    if i%j ==0:
      count +=1
  if count == 1:
    r +=1
print(r)

소수는 1과 자기자신이 약수인 수를 의미한다. 하지만 1은 소수가 아니다. 그래서 2부터 자기 자신까지 나눴을 때 나머지가 0인 횟수가 1인 경우만 결과에 1을 더해줬다.

다섯번째 문제
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

a = int(input())
b = int(input())
el = []
for i in range(a, b+1):
  count = 0
  for j in range(2,i+1):
    if i%j == 0:
      count +=1
  if count == 1:
    el.append(i)
if not el:
  print(-1)
else:
  print(sum(el))
  print(el[0])

네번째 문제와 마찬가지로 풀었고 el이라는 빈 리스트를 만들어 소수가 없을 시 -1을 아닐 시 소수의 합계와 가장 작은 수를 리턴 해 줬다.

여섯번째
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.

예제 입력 1
3 16

예제 출력 1
3
5
7
11
13

a,b = map(int,input().split())
for i in range(a, b+1):
  count = 0
  for j in range(2, i+1):
    if i%j == 0:
      count +=1
  if count == 1:
    print(i)

이렇게 풀었지만 a,b의 범위가 작을때는 잘 작동하지만 그 수가 커지면 시간초과로 인해서 문제를 해결할 수 없다.

그래서 검색하던 도중 에라토스테네스의 체를 통해서 문제를 풀어야 한다는 사실을 알았다.

  1. 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서 회색 사각형으 로 두른 수들이 여기에 해당한다.
  2. 2는 소수이므로 오른쪽에 2를 쓴다. (빨간색)
  3. 자기 자신을 제외한 2의 배수를 모두 지운다.
  4. 남아있는 수 가운데 3은 소수이므로 오른쪽에 3을 쓴다. (초록색)
  5. 자기 자신을 제외한 3의 배수를 모두 지운다.
  6. 남아있는 수 가운데 5는 소수이므로 오른쪽에 5를 쓴다. (파란색)
  7. 자기 자신을 제외한 5의 배수를 모두 지운다.
  8. 남아있는 수 가운데 7은 소수이므로 오른쪽에 7을 쓴다. (노란색)
  9. 자기 자신을 제외한 7의 배수를 모두 지운다.
  10. 위의 과정을 반복하면 구하는 구간의 모든 소수가 남는다.
a,b=map(int,input().split())
prime=[0]*(b+1)
for i in range (2, b+1):
    if prime[i]==0:
        for j in range (i+i,b+1,i):
            prime[j]=1
for i in range(a,b+1): 
    if i<2:
        continue
    elif prime[i]==0:
        print(i)

먼저 prime을 통해서 0부터 b에 이르는 수까지 0으로 배열을 만들어준다.
그 다음 소수라면 체크하지 않고 소수라면 그 배수들을 체크해준다.
그리고 다음 반복문을 통해서 체크되지 않은 수들을 리턴해준다.

일곱번째
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

예제 입력 1
5
5
2
3
4
1

예제 출력 1
1
2
3
4
5

a = int(input())
el=[]
for i in range(a):
  el.append(int(input()))
for i in sorted(el):
  print(i)

빈 리스트 안에 숫자를 넣어둔 후 sorted를 통해서 재정렬함

0개의 댓글