문제)
숫자 카드 게임은 여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 단, 게임의 룰은 아래와 같다.
1. 숫자가 쓰인 카드들이 N x M 형태로 놓여 있다. 이 때 N은 행의 개수를 의미하며, M은 열의 개수를 의미한다.
2. 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
3. 그 다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
4. 따라서 처음에 카드를 골라낼 행을 선택할 때, 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다.
입력 조건)
1. 첫째 줄에 숫자 카드들이 놓인 행의 개수 N과 열의 개수 M이 공백을 기준으로 하여 각각 자연수로 주어진다. (1 ≤ N, M ≤ 100)
2. 둘째 줄부터 N개의 줄에 걸쳐 각 카드에 적힌 숫자가 주어진다. 각 숫자는 1 이상 10,000 이하의 자연수이다.
출력 조건)
1. 첫째 줄에 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력한다.
입력 예시)
3 3
3 1 2
4 1 4
2 2 2
출력 예시)
2
해당 문제에서 핵심은 리스트로 입력받은 각 행들의 숫자들 중 가장 작은 수들끼리 비교해서 그 중 가장 큰 수를 선택해야 한다는 것이다. 따라서 공백을 기준으로 리스트의 행의 숫자들을 입력받음과 동시에 리스트의 행들을 오름차순으로 정렬해준다. 이러한 과정을 N번 거쳐서 모든 숫자들을 입력받는다. 이러한 과정을 거치면 입력받은 리스트는 각 행별로 오름차순 정렬이 되어있다.
마지막으로 각 행들의 0번째 인덱스의 수를 비교해서 가장 큰 수를 찾고 출력하면 모든 조건에 부합한 수를 출력할 수 있다.
예제3.2와 마찬가지로 리스트[행].sort() 를 통해서 오름차순 정렬을 해주었다.
소스코드
더욱 간단한 방법은 아래와 같다.
- N번 반복하는 반복문을 통해 각 행별로 입력받는다.
- 이 때, 받은 입력을 리스트화 하지 않고 행 별로 입력받음과 동시에 최솟값을 찾는다.
- 반복문을 돌면서 이전의 최솟값과 현재 최솟값을 비교하여 더 큰 값으로 초기화 한다.
- 최종적으로 초기화 한 값을 출력한다.
이러한 방법을 통해서 위의 소스코드보다 더욱 간단한 코드를 구현할 수 있다. 반복문을 1번만 실행하게 할 수 있는 것이다.
소스코드
'Algorithm' 카테고리의 다른 글
구현 (Implementation) (1) - 코딩테스트에서 구현이란? / 예제 4.1) 상하좌우, 예제 4.2) 시각 (0) | 2023.07.28 |
---|---|
그리디 (Greedy) (4) - 실전문제 3.4) 1이 될 때까지 (0) | 2023.07.22 |
그리디 (Greedy) (2) - 실전문제 3.2) 큰 수의 법칙 (0) | 2023.07.22 |
그리디 (Greedy) (1) - 그리디 알고리즘이란? / 예제 3.1) 거스름돈 (0) | 2023.07.19 |
복잡도 (Complexity) (4) - 시간과 메모리 측정 (0) | 2023.07.19 |