알고리즘-그리디2 숫자 카드게임, 1이될 때까지

Jamwon·2021년 6월 1일
0

알고리즘

목록 보기
7/18
post-thumbnail

문제 숫자 카드 게임

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

  1. 숫자가 쓰인 카드들이 N*M (n은행 m은 열)
  2. 뽑고자 하는 카드가 포함되어있는 행을 선택
  3. 선택된 행에 포함된 카드들 둥 가장 숫자가 낮은 카드를 뽑아야 한다.
  4. 따라서 처음에 카드를 골라날 행을 선택할때 이후에 해당 행에서 가장 숫자가 낮은 카드를 뽑을 것을 고려하여 최종적으로 가장 높은 숫자의 카드를 뽑을 수 있도록 전략을 세워야한다.

3 1 2 이렇게 카드가 있으면 최종적으로 세번째행에서
4 1 4 2를 뽑는게 제일큰 값이다.
2 2 2

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)

처음 입력값 2개를 행렬 값을 받아서 한줄씩 열의 최솟값을 result에 설정하고 다음줄이 더 크다면 result를 바꿔준다.

문제 1일 될 때까지

어떤한 수 N이 1이될 때까지 다음의 두 과정 중 하나를 반복적으로 선택하여 수행하려고 한다. 단 두번째 연산은 N이 K로 나누어 떨어질때만 선택할 수 있다.
1. N에서 1을 뺀다.
2. N을 K로 나눈다.

N = 17 K = 4라고 하면 1,2,2, 하면 1이되므로 3이 최소횟수이다.
과정의 최소 횟수를 구하시오
2<= N <=100000 k는 N보다 같거나 크다

n, k = map(int, input().split())
result = 0
while n != 1:
    if n % k != 0:
        n -= 1
        result += 1
    else:
        n = n / k
        result += 1

print(result)

2개의 문자열을 받아서 k로 나눈 나머지가 0이아니면 -1을 해주고 나머지가 0이면 나누어 준다. 나누어 주는게 무조건(2일땐 아니지만) 더 빨리 1을 도출하기 때문

n, k = map(int, input().split())
result = 0
while True:
    target = (n // k) * k
    result += (n - target)
    n = target
    if n < k:
        break
    result += 1
    n //= k
result += (n-1)
print(result)

위와 같은 방식으로 N의 범위가 엄청나게 클때 빠르게 작동시키는 코드이다. N이 K의 배수가 되도록 1씩 계속 빼는게 아니라 계산해서 한번에 빼는것이다.

profile
한걸음씩 위로 자유롭게

0개의 댓글