[8/20] 이코테 그리디

이경준·2021년 8월 20일
0

코테

목록 보기
83/140
post-custom-banner

<3> 숫자 카드 게임

n, m = map(int, input().split())
arr = []

for _ in range(n):
    temp = list(map(int, input().split()))
    arr.append(temp)

num = 0
for number in arr:
    num = max(num, min(number))
    
print(num)

<4> 1이 될 때까지

n, k = map(int, input().split())

cnt = 0
while True:
    if (n % k == 0):
        n = n // k
    else:
        n = n - 1
        
    cnt += 1
    if n == 1:
        break
        
print(cnt)


<1> 모험가 길드

320

내 코드

n = int(input())
arr = list(map(int, input().split()))

team = 0
count = 0

for i in arr:
    count += 1
    if ( count >= i ):
        team += 1
        count = 0

print(result)

로직

  1. 리스트 오름차순 정렬
  2. 첫번째 값을 기준으로 임시 리스트를 만든다.
  • 리스트 길이가 리스트 최대값 이상이면, cnt를 증가시키고 리스트를 새롭게 정의한다.
  • 아니라면 반복문을 종료한다.

<2> 곱하기 혹은 더하기

313

내 코드 (최근)

n = input()
arr = list(map(int, n))

num = arr[0]

for i in range(len(arr)-1):
    if (num == 0 or arr[i+1] == 0):
        num = num + arr[i+1]
    else:
        num = num * arr[i+1]
        
print(num)

내 코드 (예전)

s = input()
s = list(map(int, s))


for i in range(len(s)-1):
    
    #맨처음
    if (i == 0):
        if (s[0] == 1 or s[0] == 0 or s[1] == 1 or s[1] == 0):
            answer = s[0] + s[1]
        else:
            answer = s[0] * s[1]
        
    #맨마지막전
    elif (i == len(s)-1):
        if (s[-1] == 1 or s[-1] == 0 or s[-1] == 1 or s[-1] == 0):
            answer = answer + s[-1]
        else:
            answer = answer * s[-1]
    
    #나머지
    else:
        if (s[i+1] == 0 or s[i+1] == 1):
            answer = answer + s[i+1]
        else:
            answer = answer * s[i+1]
    
print(answer)

로직

  • 로직은 이해했지만, 노가다로 풀었다 쩝...

효율적인 코드

s = input()
s = list(map(int, s))

answer = s[0]

for i in range(1, len(s)):
    if (s[i] <= 1 or answer <= 0):
        answer = answer + s[i]
    else:
        answer = answer * s[i]    
    
print(answer)

풀이

  • 간단하게 머리를 쓴 풀이다.

<3> 문자열 뒤집기

313 문제
https://naekang.tistory.com/42

내 코드

s = input()

cnt = 0

for i in range(len(s)-1):
    if s[i] != s[i+1]:
        cnt += 1
        
change = (cnt+1) // 2

print(change)

로직

  • 연속 문자열은 숫자 하나로 압축한다.
  • 바뀐횟수+1 // 2 만큼 뒤집어주면 된다.

<4> 만들 수 없는 금액

315

내 코드

from itertools import combinations

n = int(input())
arr = list(map(int, input().split()))

if (len(arr) == 1):
    if arr[0] == 1:
        print(2)
    else:
        print(1)
else:

    answer = arr[:]

    for i in range(2, n+1):

        for j in combinations(arr, i):
            temp = sum(j)

            answer.append(temp)

    answer = list(set(answer))
    answer.sort()
    for i in range(1, len(answer)):
        if ( i != answer[i-1] ):
            print(i)
            break
    else:
        print(answer[-1]+1)

로직

  • combinations를 이용하여 조합으로 풀었다. (노가다)

효율적인 코드

n = int(input())
data = list(map(int, input().split()))
data.sort()

target = 1

for x in data:
    
    if target < x:
        break
    
    target += x
    
    print(x, target)
    
print(target)

피드백

  • 원리를 이해하려고 노력했지만 실패했다.

<5> 볼링공 고르기

코드

from itertools import combinations

n, m = map(int, input().split())
arr = list(map(int, input().split()))

cnt = 0
for a, b in combinations(arr, 2):
    if (a != b):
        cnt += 1
        
print(cnt)

코드 (두번째)

n, m = map(int, input().split())
arr = list(map(int, input().split()))
answer = []

for i in range(len(arr)-1):
    for j in range(i+1, len(arr)):
        if (arr[i] != arr[j]):
            answer.append([i, j])
            
print(len(answer))

로직

  • 첫번째 : 조합 라이브러리
  • 두번째 : 2중 for문

<6> 무지의 먹방 라이브

코드

profile
The Show Must Go On
post-custom-banner

0개의 댓글