0411 Greedy

누디·2023년 4월 11일
0

알고리즘

목록 보기
4/5

1931 : 회의실 배정

n = int(input())

time = []

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

time = sorted(time, key=lambda a: a[0])
time = sorted(time, key=lambda a: a[1])

last = 0
cnt = 0

for i, j in time:
    if i >= last:
        cnt += 1
        last = j

print(cnt)

📌 정렬

1. sort

  • '변수.sort()' 형태로 사용
  • 정렬 기준 : 오름차순

2. sorted

  • 정렬된 결과를 반환시키되, 원형 변형 X
  • () 안에 iterable 자료형

3. parameter

3-1. reverse

  • reverse=True -> 내림차순 정렬

3-2. key

  • 정렬을 목적으로 하는 함수를 값으로 넣는다.
  • key 값을 기준으로 정렬
  • 디폴트 값은 오름차순

📌 lambda 함수

  • 정의와 호출을 한 번에 하는 익명함수
  • 복잡한 함수 호출 과정을 생략해서 처리 시간 단축
  • return 명령어 볼 수 없음
lambda 매개변수 : 실행문(전달 값)
  • lambda 명령어 다음에 오는 매개변수에 의해 외부의 값을 받고,
  • : 다음에는 실행문의 실행 결과가 반환됨
# 일반 함수
def Adder(x, y):
	add = x + y
    return add
    
# 람다 함수
print('add =', (lambda x, y : x + y) (10, 20))

2217 : 로프

n = int(input())
lst = []

for _ in range(n):
    w = int(input())
    lst.append(w)

lst.sort(reverse=True)
result = []

for j in range(n):
    result.append(lst[j] * (j+1))

print(max(result))

처음엔 그냥 가장 작은 값에 n을 곱하면 되는거 아닌가 생각했지만 당연히 실패...
병렬 연결이니까 최대 n개 연결 가능
그럼 가장 작은 중량에 n개가 할당됨
더 큰 중량은 당연히 그 중량을 버틸 수 있기 때문에
그래서 각 중량을 내림차순으로 정렬한 후, n을 1부터 곱해주어 새로운 리스트에 저장
리스트 중 가장 큰 값이 답!

1026 : 보물

n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

A.sort()

result = 0

for i in range(n):
    x = A[i]
    y = B.pop(B.index(max(B)))
    result += x*y

print(result)

처음엔 리스트 B를 정렬해서 풀었으나, 문제 조건에 그러지 말라고 써져있어서 다시 풀었다.

📌 리스트 관련 함수

index

index(x) 함수는 리스트에 x 값이 있으면 x의 인덱스 값을 리턴한다!

insert

insert(a, b) 함수는 a번째 위치에 b를 삽입하는 함수이다.

remove

remove(x)는 리스트에서 첫 번째로 나오는 x를 삭제하는 함수이다.

pop

pop()은 리스트의 맨 마지막 요소를 리턴하고 그 요소는 삭제한다.
정렬 후에 사용하면 최대 값만 제거 가능

0개의 댓글