♻️Greedy - 숫자 카드 게임

dev_itzel_02✨·2024년 11월 13일

♻️Algorithm

목록 보기
4/12
post-thumbnail

🏷️숫자 카드 게임

여러 개의 숫자 카드 중에서 가장 높은 숫자가 쓰인 카드 한 장을 뽑는 게임이다. 룰은 다음과 같다

1. 숫자가 쓰인 카드들이 N X M 형태로 놓여 있다. 
이때 N은 행의 개수를 의미하며, M은 열의 개수를 의미한다.
2. 먼저 뽑고자 하는 카드가 포함되어 있는 행을 선택한다.
3. 그 다음 선택된 행에 포함된 카드들 중 가장 숫자가 낮은 카드를 뽑아야 한다.
4. 따라서 처음에 카드를 골라낼 행을 선택할 때,
이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야 한다. 

🔹입력 조건

첫째 줄에 숫자 카드들이 놓인 행의 개수 N과 열의 개수 M이 공백을 기준으로 하여 각각 자연수로 주어진다.
둘째 줄부터 N개의 줄에 걸쳐 각 카드에 적힌 숫자가 주어진다.
각 숫자는 1 이상 10,000 이하의 자연수이다.

🔹출력 조건

첫째 줄에 게임의 룰에 맞게 선택한 카드에 적힌 숫자를 출력한다.

🔹입력 예시

3 3
3 1 2
4 1 4
2 2 2

🔹출력 예시

2

🧐접근 방향

  • 각 행의 최솟값을 찾는다 👉🏼 반복문 사용
  • 최솟값들 중에서 가장 큰 수를 찾는다

📑나의 답안

# 행, 열 개수 입력받기
n, m = map(int, input().split())

# 숫자 입력받기 -> 2차원 배열 생성 동시에 최솟값 추출 
cards = [] # 생략
min_list = []
for i in range(n):
    row_card = list(map(int, input().split()))
    cards.append(row_card) # 생략
    min_list.append(min(row_card))

print(max(min_list)) # 최솟값들 중에 가장 큰 수 출력 

👉🏼 가장 큰 숫자만 찾으면 되기 때문에, 굳이 cards 리스트를 생성하지 않아도 될 것 같다.

📑예제 답안 1

# min 함수를 이용한 예시
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)

👉🏼 result 라는 변수를 선언한 후 0 이라는 값으로 초기화를 한다. 행 별로 숫자를 입력받는 동시에 최솟값을 찾아 min_value 변수를 초기화 한다. 그 후 max 함수를 이용해 resultmin_value 값을 비교하여 더 큰 값을 result 에 넣어 값을 갱신한다. 최종적으로 result 에 저장된 값을 출력한다.

📑예제 답안 2

# 2중 반복문 사용한 구조
n, m = map(int, input().split())

result = 0
for i in range(n):
    data = list(map(int, input().split()))
    # 현재 줄에서 가장 작은 수 찾기
    # 숫자의 범위가 1 이상 10,000 이하의 자연수이기 때문에
    # 당연히 입력된 숫자보다 큰 10001이라는 값으로 초기화한 것 
    min_value = 10001 
    for a in data:
        min_value = min(min_value, a)
    # 가장 작은 수 중에서 가장 큰 수 찾기
    result = max(result, min_value)

print(result)

👉🏼 예제 답안 1과의 차이점은 행에서 가장 작은 수를 찾는 방식이 다르다는 것이다. 예제 답안 1은 min 함수를 사용해 data 리스트에서 최솟값을 찾았고, 예제 답안 2는 for문을 이용해 data 리스트에 있는 요소를 하나씩 꺼낸 후 min 함수를 이용해 min_valuea 를 비교하여 찾는 방식을 사용했다.


🤔Curiosity

예제 답안 2를 보고 드는 궁금증은 , , ,
min 함수는 리스트 요소에서 최솟값을 반환하는함수인데,
굳이 반복문을 사용해 리스트 요소를 하나씩 꺼내와서 값을 비교한 후
반복적으로 값을 갱신하는 이유가 무엇일까❓

위의 답안은 조건에서 주어진 숫자의 범위를 이용한 문제 풀이인 것 같다.

예제 답안 1의 시간 복잡도와 예제 답안 2의 시간 복잡도는 O(n x m) 으로 이론적 시간 복잡도는 같지만 답안 1의 코드가 불필요한 루프를 제거하여 실제 실행 시간 측면에서는 더 효율적일 것 같다.

연습 문제에서 주어지는 입력 값은 예시로 주어지는 적당한 수이지만,
실제로 조건에서 주어지는 값의 범위를 확인하여 가장 큰 값이 주어지는 경우도 고려해보아야 할 것 같다.


👣Reference

  • 이것이 코딩 테스트다 with 파이썬
profile
🐜👣steadiness🐜👣

0개의 댓글