📌 이 문제는 해당 책에서 가져왔습니다.
문제 설명
숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 단, 게임의 룰을 지키며 카드를 뽑아야 하고 룰은 다음과 같다.
숫자가 쓰인 카드들이 형태로 놓여 있다. 이때 N은 행의 개수를 의미하며, M은 열의 개수를 의미한다.
먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
그다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
따라서 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다.
예를 들어 3 X 3 형태로 카드들이 다음과 같이 놓여 있다고 가정하자.
여기서 카드를 골라낼 행을 고를 때 첫 번째 혹은 두 번쨰 행을 선택하는 경우, 최종적으로 뽑는 카드는 1이다.
하지만 세 번째 행을 선택하는 경우 최종적으로 뽑는 카드는 2이다.
따라서 이 예제에서는 세 번째 행을 선택해 숫자 2가 쓰여진 카드를 뽑는 것이 정답이다.
카드들이 형태로 놓였을 때, 게임의 룰에 맞게 카드를 뽑는 프로그램을 만드시오.
입력 조건
첫째 줄에 숫자 카드들이 놓인 행의 개수 N과 열의 개수 M이 공백을 기준으로 하여 각각 자연수로 주어진다. (1≤N, M≤100)
둘째 줄부터 N개의 줄에 걸쳐 각 카드에 적힌 숫자가 주어진다. 각 숫자는 1 이상 10,000 이하의 자연수이다.
출력 조건
코드 구현
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())
result = 0
for i in range(n):
data = list(map(int, input().split()))
# 현재 줄에서 가장 작은 수 찾기
min_value = min(data)
# 가장 작은 수들 중 가장 큰 수 찾기
result = max(result, min_value)
print(result)
입력값
3 3
3 1 2
4 1 4
2 2 2
출력값
2
다른 답안
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())
result = 0
for i in range(n):
data = list(map(int, input().split()))
min_value = 10001
for a in data:
min_value = min(min_value, a)
# 가장 작은 수들 중에서 가장 큰 수 찾기
result = max(result, min_value)
print(result) # 최종 답안 출력
출력은 같기 때문에 생략하겠습니다.
여기선 가장 최댓값이 10,000이라는 조건이 있었기 때문에 일부러 10,001을 만들어 일일히 비교하여 최솟값을 저장할 수 있게 해준 것 같습니다
개인적으로 내장 함수 min을 쓰는게 훨씬 나은 것 같네요. 이중 for문 보다 그게 더 빠를 것 같고요.
내가 작성한 코드
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())
result = []
data = []
for i in range(n):
data.append(list(map(int, input().split())))
value = min(data)
result.append(value)
print(max(result))
나름 기똥차다고 생각했는데 그냥 똥🤎이었다.
입력값
3 3
3 1 2
4 1 4
2 2 2
출력값
[3, 1, 2]
하나씩 뜯어보자면
빈 리스트 data=[]
를 만든 다음에 for문을 통해 append 하면 안 된다.
왜냐하면 data.append(list(map(int, input().split())))
해당 코드는 이중 리스트를 만들어 버린다.
빈 리스트 안에 리스트를 생성해서 집어 넣으니까(apppend
)
그래서 입력하면
[[3, 1, 2]]
[[3, 1, 2], [3, 1, 2]]
[[3, 1, 2], [3, 1, 2], [2, 2, 2]]
이런식으로 생성된다.
그래서 min, max를 사용하면 저기서 아예 리스트를 내뱉는 구조가 되는 것이다.
위처럼 그냥 data = list(map(...))
의 형식대로 데이터를 입력 받는 것이 가장 일반적인 구조 같다.
value에 data의 min 값을 저장해주고 result에 하나씩 추가해주면 될 거라 생각했는데,
다시 고친 코드
# N, M을 공백으로 구분하여 입력받기
n, m = map(int, input().split())
result = []
data = []
for i in range(n):
data = list(map(int, input().split()))
value = min(data)
result.append(value)
print(max(result))
입력값
3 3
3 1 3
4 1 3
2 2 2
출력값
2
이렇게 하면 원하던 값이 나오긴 한다.
여기서 마지막 출력에 max를 통해 어쨌든 원하던 값을 뱉어내게 만들었지만, 보통 최종 답안은 print(result)
로 고정되어 있을 수 있으니까
for문 안에서 다 해결해보는 연습이 많~이 필요할 것 같다.