Home 이코테 Ch.1 그리디 알고리즘 (2)
Post
Cancel

이코테 Ch.1 그리디 알고리즘 (2)

입력 예시가 있는 문제들이 있는 경우는 input 값을 입력하는 형태로 구성해주면 된다.

특히나 input값을 가지고 연산이 필요한 경우는 map 함수를 통해 int, float 등 필요한 숫자형태로 변형해준다.

만약 배열의 형태로 가져오고 싶다면 list와 map 함수를 사용한다.

[예시 코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# input 값으로 받은 값들은 정수형으로 반환
# 각 입력값들은 공백으로 구분하며, 각각 n, m, k라는 변수에 할당됨
n, m, k = map(int, input().split())

# 숫자 여러개를 입력받아 배열 반환
# 입력값들은 공백으로 구분하고, 정수로 변환 후 배열에 넣음
data = list(map(int, input().split()))

# map 함수를 이용하지 않는다면? 반복문으로 처리하서 일일이 append 해줘야하는데 비효율적임
# map 함수의 다른 사용법
# map(함수, 배열)
# 배열의 요소 하나씩 함수를 적용하여 반환
def func_pow(x):
    return pow(x, 5)

result = list(map(func_pow, [1,2,3,4,5]))

[문제풀이]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))

# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()

# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]

# 초기값 설정
result=0

# 반복문
while True:
    # 가장 큰수 k번 더하기
    for _ in range(k):
        if m == 0:
            break
        result += first
        m -= 1
    # 두번째로 큰수 한번 더하기
    if m == 0:
        break
    result += second
    m -= 1

print(result)

결국 수열 문제와 같은 형태라고 할 수 있다.

가장 큰수가 K번 반복되고 두번째로 큰수가 한번 나오는 형태의 수열인 것이다. EX) 6 6 6 5 6 6 6 5 6 6 6 5 ….

그럼 수열이 반복되는 횟수와 수열의 길이만 안다면 또 다른 형태의 함수로 구현이 가능해보인다.

n = 5 , m = 8, k = 3

2 4 5 4 6

5 6

(6 6 6 5), (6 6 6 5)

반복되는 수열의 길이는 k+1

m을 k+1로 나눈 몫 만큼 반복 된다 이를 수식으로 나타내면 수열의 패턴이 반복되는 횟수는 m//(k+1)

이를 통해서 새로운 함수를 작성해보면,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))

# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()

# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]

# 가장 큰수가 더해지는 횟수
count = (m//(k+1))*k
count += m%k

result = 0
result += count*first
result += (m-count)*second

print(result)

m이 k+1로 나누어 떨어지는 경우만 고려했기 때문에 완벽한 함수가 아니다.

m이 k+1로 나누어 떨어지지 않는 다는 것은 그 나머지 만큼 가장 큰수를 추가로 더한다는 것을 의미한다.

이는 가장 큰수를 총 몇번 더하는지에 대한 수식이 count = (m//(k+1))*k + m%(k+1)로 바뀐다.

이를 반영해 다시 함수를 짜면,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# N, M, K 공백으로 구분하여 입력받기
n, m, k = map(int, input().split())
# N개의 수를 공백으로 구분하여 입력받기
arr = list(map(int, input().split()))

# 오름차순 정렬 => 내림차순 arr.sort(reverse=True)
arr.sort()

# 가장 큰수와 두번째로 큰수 가져오기
first = arr[n-1]
second = arr[n-2]

# 가장 큰수가 더해지는 횟수
count = (m//(k+1))*k + m%(k+1)

result = 0
result += count*first
result += (m-count)*second

print(result)
This post is licensed under CC BY 4.0 by the author.

Hadoop Deep Inside - Ch.1 분산 파일 시스템(Distributed File System)

Hadoop Deep Inside - Ch.2 구글 파일 시스템(Google File System) (1)