All Articles

백준 Online Judge - 1차원 배열 2562번 최댓값, 10818번 최소, 최대

2562번 최댓값

문제

9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
예를 들어, 서로 다른 9개의 자연수

3, 29, 38, 12, 57, 74, 40, 85, 61

이 주어지면, 이들 중 최댓값은 85이고, 이 값은 8번째 수이다.

예제 입력

3
29
38
12
57
74
40
85
61

예제 출력

85
8

내 풀이

numbers = []
for i in range(9):
  numbers.append(int(input()))
largest_number = max(numbers)
nth = numbers.index(largest_number) + 1
print(largest_number)
print(nth)

한 줄씩 주어지는 input을 for문으로 빈 리스트에 밀어넣었다. 리스트 안에서 max() 함수로 최댓값을 구했고, 구한 최대값으로 인덱스 위치를 구했다. 인덱스는 0부터 시작하므로 주어진 숫자 중 몇 번째인지 출력하려면 인덱스 값에 1을 더해줘야한다.

처음에는 입력값을 통째로 리스트로 받아 처리했다. 그리고 max() 함수 말고 sorted() 함수로 정렬한 새 배열을 만든 뒤 새 배열의 -1번째 인덱스(= 가장 마지막 요소 = 가장 큰 값)를 구했다.

numbers = list(map(int, input().split('\n')))
sorted_numbers = sorted(numbers)
largest_number = sorted_numbers[-1]
nth = numbers.index(largest_number) + 1
print(largest_number)
print(nth)

입력값이 한 줄씩 구분해서 들어오기 때문에 개행문자로 구분해줘서 리스트로 만들면 되겠다고 생각했는데 한 줄로 입력되는 인풋에만 적용 가능한듯 하다. (예 - 3 29 38 12 57 74 40 85 61)

10818번 최소, 최대

문제

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

예제 입력

5
20 10 35 30 7

예제 출력

7 35

내 풀이

cnt = int(input())
numbers = list(map(int, input().split()))
numbers.sort()
print(numbers[0], numbers[-1])

처음에는 N을 먼저 구분해서 받은 뒤, N개의 정수를 리스트로 받아야겠다고 생각했다. 그 다음에 리스트를 정렬해주고 0번째 값과 -1번째 값을 출력해주면 되겠다고 생각했다.

for i in range(1):
  cnt = int(input())
for i in range(1):
  numbers = map(int, input().split())
numbers.sort()
print(numbers[0], numbers[-1])

저 의미없는 for문 두 개는 무엇… for문을 한 번 돌리는 게 정해진 거라면 굳이 for문을 쓸 이유가 없지 않은가. 그리고 numbers = map(int, input().split()) 이 부분에서 map 객체를 list로 만들어줬어야 하는데 그 부분도 빼먹어서 런타임 에러가 났다.

아무튼 map 객체를 list로 만들어줬다고 해도 시간 복잡도 측면에서 마지막에 제출한 답이 훨씬 빠르므로 처음 시도한 방법은 썩 좋은 방법이 아니다. (최종 답안 시간 672ms, (맞게 고친) 첫 번째 답안 시간 736ms)

번외로, 시간을 단축한 과정은 아래와 같다.

  1. 700ms
cnt = int(input())
if cnt == 1:
  number = int(input())
  print(number, number)
else:
  numbers = list(map(int, input().split()))
  numbers.sort()
  print(numbers[0], numbers[cnt-1])

문득 생각해보니 정수 1개일 때 조건을 굳이 추가해줄 필요가 있나 싶어서 제외해보았다. 그것이 아래 2번.

  1. 680ms
cnt = int(input())
numbers = list(map(int, input().split()))
numbers.sort()
print(numbers[0], numbers[cnt-1])

혹시 리스트 마지막 요소를 뽑아낼 때 [-1]을 쓰면 더 빠를까 싶어서 시도해보았다. 그것이 최종 답안이고 8ms 더 줄었다.

  1. 672ms (최종 답안)
cnt = int(input())
numbers = list(map(int, input().split()))
numbers.sort()
print(numbers[0], numbers[-1])