코딩 테스트

백준 10818, 2562 파이썬 1차원 배열 풀이

이삼오 2024. 4. 1. 19:05

1. 10818번

문제

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

입력

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

출력

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

 

import sys

n = int(sys.stdin.readline())
v = list(map(int, sys.stdin.readline().split())

print(min(v), max(v))

 

코드 풀이

import sys 후 n에 sys.stdin.readline()으로 입력받은 뒤 int 함수를 적용한다.

같은 코드로 입력받은 값들을 split() 메서드로 분할하고 map 함수로 int 변환을 일괄 적용한다. 이렇게 입력받은 정수들에 list() 함수를 씌워 리스트 형태로 변환하고 새로운 변수 v에 저장한다. 

print() 함수 안에 min(), max() 함수를 사용해 리스트 v의 최소값, 최대값을 출력한다. end=''로 특정 포맷을 작성하지 않을 경우  print 함수는 각 인자를 공백으로 구분해서 반환한다. 

이 문제 역시 길이가 n인 리스트라는 조건을 쓰지 않아도 알아서 길이가 n인 리스트만 입력받아 답이 처리된다. n을 따로 입력받는 이유가 조금 의문이긴 하다. 

 

만약 리스트 컴프리헨션으로 입력받고 싶다면 다음처럼 작성할 수 있다.

import sys

n = int(sys.stdin.readline())
v = [int(x) for x in sys.stdin.readline().split()]

print(min(v), max(v))

 

for문을 통해 입력을 n번 반복해서 리스트를 만들고 min, max를 반환하는 코드를 작성해보려고 했는데 계속 런타임 오류가 생겼다. 이는 n=1일 경우 min, max 두 인자를 반환할 수 없어 발생하는 오류인듯 하다. 

참고 링크 : https://www.acmicpc.net/board/view/129373

 

 

1. 2562번

문제

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

입력

첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.

출력

첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 몇 번째 수인지를 출력한다.

import sys

n = [int(sys.stdin.readline()) for i in range(9)]

print(max(n), (n.index(max(n)) + 1), end='\n')

 

코드 풀이

sys를 import하고 sys.stdin.readline()을 9번 반복해서 입력받는다. 9개의 줄에 하나씩 입력받은 값들을 int 함수로 정수 변환하여 [리스트 형식]으로 n에 저장한다. 

 

sys.stdin.readline()으로 입력받은 데이터에는 개행문자가 포함되어 있다. 한 줄로 입력받아 데이터로 저장한다면 .strip() 메서드를 사용해야 한다. 지금까지 백준 문제를 풀면서 split()을 사용해 입력값을 분할하고 정수형 데이터로 변환했기 때문에 따로 개행문자를 제거하지 않았다. 이 문제에서도 한 줄이 아닌 여러 개의 줄에 값을 입력받고 정수형 데이터로 변환해 그대로 리스트에 저장했기 때문에 strip 메서드를 사용하지 않았다. 

 

max(n)으로 리스트 n의 최댓값을 출력하고 n.index로 리스트 안의 max(n) 인덱스에 접근한다. 파이썬 인덱스는 0부터 시작하지만 문제 예시를 보면 1부터 시작하는 인덱스를 출력해야 한다. 따라서 n.index(max(n))에 1을 더해 인덱스 번호를 1부터 시작하는 것처럼 만든다. print문을 두 줄로 나눠서 작성해도 되지만 end='\n' 조건을 걸어 max(n)를 프린트한 다음 한 줄을 띄우고 max(n)의 인덱스를 출력했다. 

 

import sys
n = []
for i in range(9):
    n.append(int(sys.stdin.readline()))

print(max(n))
print(n.index(max(n)) + 1)

 

for문을 사용해 입력받고 싶다면 위와 같이 작성할 수 있다. for문을 작성하면서 에러가 엄청나게 많이 났는데 괄호를 안 닫아서였다. 코드를 꼼꼼히 읽는 습관을 들여야겠다.