코딩테스트 공부

그리디 문제 풀이

원준킹 2021. 1. 6. 20:28

 

문제 1. 곱하기 혹은 더하기 (난이도 1, 풀이 시간 19분/30분, 정답(추정))

#6:31 50
#문자열 s : 0~9로 이뤄짐
#숫자사이에 x + 넣으며 연산가능 최대값 , + x 사이 우선순위없음
#결과는 항상 20억 미만

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

# 2 9 0 8 4
# 0이 왼쪽 끝에 있을 때: 오른쪽이랑 +
# 0이 오른쪽끝 : 왼쪽이랑 +
# 0이 가운데: 0이 이전 인덱스에 있고 현재가 0이 아니면 +

#0 + 2
#0 + 2 + 2
#

#0 + 2 +  0 + 2 x 2
res = 0

for x,y in enumerate(data):
    if x == 0 and y == 0:
        continue
    elif x == len(data)-1 and y == 0:
        continue
    else:
        if y != 0:
            if res == 0:
                res += y

            elif data[x-1] == 0:
                res += y
            else:
                res *= y
        elif y == 0:
            continue

print(res)






 

문제 2. 문자열 뒤집기 (난이도 1, 풀이 시간 8분/20분, 정답(추정))

#6:52 7:00
#00110101 변화점 3개
#00110011 변화점 2개

#001101011 변화점 3개

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

if data[0] == 1:
    for x,y in enumerate(data):
        if data[x] == 0:
            data[x] = 1
        elif data[x] == 1:
            data[x] = 0

point = 0
for i in range(1,len(data)):
    if data[i-1] == 0 and data[i] == 1:
        point += 1

print(point)

 

문제 3. 만들 수 없는 금액 (난이도 1, 풀이시간 44분/30분, 정답(추정))

#7:02 44
#N개의 동전으로 만들 수 없는 양의 정수금액 중 최소값 , 중복 X
import math

N = int(input())

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

data = sorted(data)

comb = []
i = 0
#만들 수 있는 조합 구하고 두 원소간 차이가 2 이상 나면 이전 원소값 +1 이 결과, 끝까지 차이가 안나면 만들 수 있는 조합의 합 최대값 +1


for i in range(2**N):
    indi = [0] * N
    j = 0

    while i != 0:
        if i%2 == 0:
            indi[j] = 0
        else:
            indi[j] = 1
        i = i // 2
        j += 1
    sum_ = 0
    for j in range(N):
        if indi[j] == 1:
            sum_ += data[j]
    comb.append(sum_)

comb = sorted(comb)
for i in range(1,len(comb)):
    if comb[i] > comb[i-1] + 1:
        print(comb[i-1]+1)
        break




 

 

- 요소가 N가지 있을 때 2**N 의 방법에 대한 모든 조합을 구현하는데 애를 먹음

- 이진수의 형태를 참고해서 풀려했는데 이진수 구하기를 코드로 처음짜봐서 구현하는데 시간이 오래걸림

 

 

정답 참고

#7:02 44
#N개의 동전으로 만들 수 없는 양의 정수금액 중 최소값 , 중복 X
import math

N = int(input())

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

data = sorted(data)

# 1 1 2 3 9
#1 2 5 8 10

#1까지 만들수있을때 2 올수있음
#1옴

#2까지 만들수있을때 3 올수있음
#2옴

#4까지 만들수있을때 5  올수있음
#3옴

#7까지 만들수있을때 8 올수있음
#9옴 x
#8이 안와서 8을 못만들었으므로 결과는 8
tg = 1
for i in data:
    if tg < i:
        break
    else:
        tg = tg + i





- 이해하는데 한참 걸렸다

- 말로 풀어내는 연습 더 해야할 듯

 

 

문제 4. 볼링공 고르기 (난이도 1, 풀이시간 10분/30분, 비효율)

말 그대로 구현

 

#4:20

#공 n개 같은 무게 다른공

#무게 1~m

# 서로 다른 무게 볼링공 고르기

# 총 경우의 수



N,M = map(int,input().split())

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



cnt = 0

for i in range(0,N-1):

    for j in range(i+1,N):

        if data[i] != data[j]:

            cnt += 1



print(cnt)

 

- 1차원 적인 구현

 

 

 

 

 

N,M = map(int,input().split())

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



cnt = 0



#1 3 2 3 2

#1 5 4 3 2 4 5 2

#(무게 낮은거, 무게 많은거) 조합

#무게1 -> 무게2 x2 무게3 x1 무게4 x2 무게5 x2 = 2+1+2+2 = 7

#무게2 x2 -> 무게3 x1 무게4 x2 무게5 x2 = 2+4+4 = 10

#무게3 x1 -> 무게4 x2 무게5 x2 = 2+2 = 4

#무게4 x2 -> 무게5 x2 = 4

#무게5 x2 -> x0 = 0

#총합 25



muge = [0]*11

for i in data:

    muge[i] += 1



for i in range(0,len(muge)-1):

    if muge[i] != 0:

        cnt += muge[i] * sum(muge[i+1:])



print(cnt)

- 좀 더 효율적인 구현

 

 

문제 5. 무지의 먹방 라이브 (난이도 1(체감 2.5), 풀이시간 x/30분,  책 풀이 참고하여 풀음)

import heapq
def solution(food_times, k):
    q = []
    for x,y in enumerate(food_times):
        heapq.heappush(q,(y,x+1)) # 시간, 순번
    passed = 0
    prev = 0
    while q:
        k1 = k
        print(q, k, passed)
        if(prev == q[0][0]):
            heapq.heappop(q)
            continue
        k1 -= len(q) * (q[0][0]-prev)
        if k1 < 0:
            break
        k = k1
        passed += len(q) * (q[0][0]-prev)
        prev = q[0][0]
        heapq.heappop(q)



    if len(q) == 0:
        return -1
    if passed == 0:
        return k % len(food_times) + 1


    q = sorted(q,key=lambda x:x[1])
    answer = q[k%len(q)][1]

    return answer


print(solution([3,1,1,1,2,4,3],12) )

#3,1,2 3/ 2,0,1 2 / 1,0,0 1/

#30 15 20 10 5 3 /6x3/ 27 12 17 7 2 0 /5x2/ 25 10 15 5 0 0 /4x5/

#20초면 27 12 17 7 2 0 에서 20-18 = 2초 남은것




 

 

 

- 우선순위 큐 (heapq)를 써야한다는 힌트를 책에서 얻고 풀음 

 

'코딩테스트 공부' 카테고리의 다른 글

구현 문제 풀이  (0) 2021.01.09
최단 경로  (0) 2021.01.06
다이나믹 프로그래밍  (0) 2020.12.31
이진 탐색  (0) 2020.12.30
정렬  (0) 2020.12.29