난이도 : Silver1
Link : https://www.acmicpc.net/problem/18230
Tag : 그리디 알고리즘, 정렬
풀이일자 : 2024년 8월 23일
2 * N : 타일의 크기
A : 2 x 1 타일의 갯수
B : 2 x 2 타일의 갯수
둘째 줄 : A 타일의 예쁨 정도
셋째 줄 : B 타일의 예쁨 정도
가장 이쁜 타일들로 깔아야 함으로 정렬 후 가장 큰것 부터 까는 것이 좋아보이는 문제이다.
매번 리스트에서 가장 예쁜 타일을 찾는 것은 시간복잡도상 N x A x B 까지 반복 될 수 있어 문제가 발생 할 수 있으므로 정렬을 통해 찾고 pop을 통해 깔은 타일을 없애고자 한다.
그리디 알고리즘을 통해 가장 예쁜 타일을 까는 것을 찾아보자.
먼저 타일의 크기를 살펴보자
1. 타일의 크기중 변화하는 값인 N 이 짝수일때
2. 타일의 크기중 변화하는 값이 N 이 홀수일때
이렇게 두가지로 나눌 수 있다.
만일 1번일 경우에는 A타일을 무조건적으로 사용해야 타일을 배치 할 수 있다.
2번일 경우에는 A 타일이 2개 이상일 때 2개를 깐 것이 B타일 1개 깐 것보다 크다면 A 타일 2개를 깔면 될것이고, 작다면 B타일 하나만 까는 것이 이득일 것이다.
정렬 하는 부분을 잘못 작성해 정렬이 적용되지 않는다.
import sys
n,a,b = map(int,sys.stdin.readline().split())
tile_A = list(map(int,sys.stdin.readline().split())) # 2*1 타일
tile_B = list(map(int,sys.stdin.readline().split())) # 2*2 타일
sorted(tile_A)
sorted(tile_B)
#n이 홀수 일때 -> A 타일을 무조건 사용
#n이 짝수 일때 -> A 타일을 사용하지 않을 수 잇음
answer = 0
if n % 2 == 1: #n이 홀수이면 A타일 무조건 사용
answer += tile_A[-1]
tile_A.pop()
n -= 1
for i in range(0,n,2):
if len(tile_A) >= 2: #A타일이 2개 이상
if tile_A[-1] + tile_A[-2] > tile_B[-1]:
answer += tile_A[-1] + tile_A[-2]
tile_A.pop()
tile_A.pop()
else:
answer += tile_B[-1]
tile_B.pop()
elif len(tile_B) >= 1 and len(tile_A) < 2: # A타일을 2개를 사용하지 못할때
answer += tile_B[-1]
tile_B.pop()
print(answer)
A나 B 배열에 비어 있을때 비교 하기 위해 접근 하는 부분이 index Error를 발생 시키는 문제점을 찾아 if문을 세분화 하여 현재 A와 B 배열이 비교가 가능 할때의 조건을 추가하여 문제를 맞추었다.
import sys
n,a,b = map(int,sys.stdin.readline().split())
tile_A = list(map(int,sys.stdin.readline().split())) # 2*1 타일
tile_B = list(map(int,sys.stdin.readline().split())) # 2*2 타일
tile_A.sort()
tile_B.sort()
#n이 홀수 일때 -> A 타일을 무조건 사용
#n이 짝수 일때 -> A 타일을 사용하지 않을 수 잇음
answer = 0
if n % 2 == 1: #n이 홀수이면 A타일 무조건 사용
if len(tile_A) >= 1:
answer += tile_A[-1]
tile_A.pop()
n -= 1
for i in range(0,n,2):
if len(tile_A) >= 2 and len(tile_B) < 1: #A타일이 2개 이상 B타일 사용 불가
answer += tile_A[-1] + tile_A[-2]
tile_A.pop()
tile_A.pop()
elif len(tile_A) >= 2 and len(tile_B) >= 1: #A타일 2개 이상 B 타일 사용 가능
if tile_A[-1] + tile_A[-2] >= tile_B[-1]:
answer += tile_A[-1] + tile_A[-2]
tile_A.pop()
tile_A.pop()
else:
answer += tile_B[-1]
tile_B.pop()
elif len(tile_B) >= 1 and len(tile_A) < 2: # A타일을 2개를 사용하지 못할때
answer += tile_B[-1]
tile_B.pop()
print(answer)