728x90

백준 단계별로 풀어보기 - 1차원 배열 문제 6개 python으로 풀기


10818 - 최소, 최대

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

n = int(input())
num = []
for e in map(int, input().split()):
    num.append(e)
print(min(num), max(num))

풀이 : n개의 정수들이 공백으로 구분지어져 주어진다. 주어진 정수들을 각각 분리하여 num이라는 list에 저장한 뒤 min, max함수를 이용하여 최소, 최대값을 출력하여준다.


2562 - 최댓값

※ 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오. 예를 들어, 서로 다른 9개의 자연수 3, 29, 38, 12, 57, 74, 40, 85, 61 이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

num = []
for _ in range(9):
    num.append(int(input()))
e_max = max(num)
for i in range(9):
  if num[i] == e_max:
    print(e_max)
    print(i+1)
    break

풀이 : 우선은 모든 정수(9개)를 입력받은 뒤 max 함수를 이용하여 최대값을 구해낸다. 그 뒤에 for 문을 이용하여 리스트의 처음부터 훑어가면서 최대값의 위치를 찾았을 때 출력해주며 함수를 끝내준다. 참고로 위치를 출력해줄 때는 i의 범위가 0~8이기 때문에 +1을 해주어 1~9로 수정해야한다.


2577 - 숫자의 개수

※ 세 개의 자연수 A, B, C가 주어질 때 A × B × C를 계산한 결과에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 프로그램을 작성하시오. 예를 들어 A = 150, B = 266, C = 427 이라면 A × B × C = 150 × 266 × 427 = 17037300 이 되고, 계산한 결과 17037300 에는 0이 3번, 1이 1번, 3이 2번, 7이 2번 쓰였다.

a = int(input()); b = int(input()); c = int(input())
abc = a * b * c
count = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for e in map(int, str(abc)):
    count[e] += 1
for result in count:
    print(int(result))

풀이 : a,b,c를 입력 받고 a * b * c를 계산한다. 그 결과를 str로 변환한 뒤 순서대로 한 개씩 따로 사용한다.

 

아래는 원래 짰던 코드인데 백준에서 런타임 에러 (ModuleNotFoundError) 가 발생했던 코드이다.

import numpy as np

a = int(input()); b = int(input()); c = int(input())
abc = a * b * c
count = np.zeros(10)
for e in map(int, str(abc)):
    count[e] += 1
for result in count:
    print(int(result))

위의 코드와 큰 차이점은 없지만 count 리스트를 정의할 때 numpy라는 라이브러리를 사용하였다. numpy는 파이썬에서 제공하는 기본 라이브러리가 아니기 때문에 백준에서는 사용할 수 없었고 처음에는 이를 몰랐어서 코드를 잘못 짠줄 알고 계속 고민했었다. 만약 이 글을 참고하는 사람이 있다면 백준에서는 numpy를 쓸 수 없다는 것을 참고하길 바란다.


3052 - 나머지

※ 두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다. 수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.

result = []
for _ in range(10):
    num = int(input())
    if num % 42 not in result:
        result.append(num % 42)
print(len(result))

풀이 : 정수를 입력받은 뒤 바로 42로 나눈 나머지를 계산한다. 동시에 결과값이 result 리스트 내에 있는지를 판별한 뒤 기존에 없던 값이라면 추가해주고 있는 값이라면 다음 수를 입력받는다.


1546 - 평균

※ 세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다. 예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다. 세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.

N = int(input())
score = []
for e in map(int, input().split()):
    score.append(e)
e_max = max(score)
print((sum(score)/N) * 100 / e_max)

풀이 : 제일 점수가 높은 것을 선택하고 모든 점수에 100/M 을 곱하여 평균을 낸다는 것은 기존 평균값에 100/M을 곱하는 것과 같은 결과를 보인다.


8959 - OX 퀴즈

※ "OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다. "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

N = int(input())
for _ in range(N):
  result = 0
  score = 0
  for i in map(str, input()):
    if i == 'O':
      score += 1
    else: score = 0;
    result += score
  print(result)

풀이 : 각 케이스의 시작 마다 result(최종 결과값)과 score(현재 O의 점수)를 0으로 초기화해준다. 그 후에는 map을 이용하여 입력된 값을 각각 한 글자 씩 분리하여 준뒤 OX를 구분하여 연속해서 O가 나올경우 score의 가치를 1씩 높여준 뒤 result에 더해준다. X가 나올 경우에는 score를 0으로 만들어준다.


4344 - 평균은 넘겠지

※ 첫째 줄에는 테스트 케이스의 개수 C가 주어진다. 둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.

N = int(input())
for _ in range(N):
  num = []
  over_mean_count = 0
  for i in map(int, input().split()):
    num.append(i)
  mean = sum(num[1:]) / num[0]
  for score in num[1:]:
    if score > mean: over_mean_count += 1
  print("{0:0.3f}%".format(over_mean_count/num[0]*100))

풀이 : 케이스 개수 N이 주어진 후에 입력되는 입력을 num 리스트에 공백을 기준으로 나누어 저장한다. 그 후에 리스트 슬라이싱을 이용하여 맨 앞인 num[0]과 점수들 num[1:]을 구분지어 평균을 계산한다. 그 후에 평균 보다 높은 점수를 가진 사람들을 세어준 뒤 전체 인원에서 비율을 구하여 출력해준다.

'코딩 공부 > 파이썬' 카테고리의 다른 글

백준 문자열 문제풀이 - 1  (0) 2022.01.20
백준 함수 문제풀이  (0) 2022.01.18
백준 While문 문제풀이  (0) 2022.01.14
백준 for문 문제풀이-2  (0) 2022.01.13
백준 for문 문제풀이-1  (0) 2022.01.12

+ Recent posts