유형 : 구현
풀이시간 : 40분....
왜 1점짜리일까?
1. 처음 작성한 코드. 그리디로 접근
def solution(sizes):
answer = 0
garo = [sizes[i][0] for i in range(len(sizes))]
sero = [sizes[i][1] for i in range(len(sizes))]
maxgaro = max(garo)
maxsero = max(sero)
#가로 값 바꾸기
newgaro = garo.copy()
newsero = sero.copy()
newgaro[garo.index(maxgaro)] = sero[garo.index(maxgaro)]
newsero[garo.index(maxgaro)] = maxgaro
newgmax = max(newgaro)
newsmax = max(newsero)
#세로 값 바꾸기
newgaro2 = garo.copy()
newsero2 = sero.copy()
newsero2[sero.index(maxsero)] = garo[newsero2.index(maxsero)]
newgaro2[sero.index(maxsero)] = maxsero
newgmax2 = max(newgaro2)
newsmax2 = max(newsero2)
return min(maxsero*maxsero, newgmax*newsmax, newgmax2*newsmax2)
그러나 특정한 case만 detect 가능한 코드였다.
아예 다르게 구현해 보자 .
2. 넓이 활용하기
def solution(sizes):
answer = 0
area = [[sizes[i][0]*sizes[i][1], sizes[i][0], sizes[i][1]] for i in range(len(sizes))]
area.sort(reverse = True)
[maxarea, maxwidth, maxdepth] = area[0]
for paper in area:
[currarea, currwidth1, currdepth1] = paper
[currarea, currdepth2, currwidth2] = paper
if currwidth1 <= maxwidth and currdepth1 <= maxdepth:
if currwidth2 <= maxwidth and currdepth2 <= maxdepth:
continue
else:
if currwidth2 <= maxwidth and currdepth2 <= maxdepth:
continue
else:
maxwidth1 = max(maxwidth, currwidth1)
maxdepth1 = max(maxdepth, currdepth1)
maxarea1 = maxwidth1 * maxdepth1
maxwidth2 = max(maxwidth, currwidth2)
maxdepth2 = max(maxdepth, currdepth2)
maxarea2 = maxwidth2 * maxdepth2
if maxarea1 < maxarea2:
maxwidth = maxwidth1
maxdepth = maxdepth1
maxarea = maxarea1
else:
maxwidth = maxwidth2
maxdepth = maxdepth2
maxarea = maxarea2
return maxarea
우선 넓이순 가로 세로 리스트를 만들고 넓이순을 기준으로 정렬한다.
초기 최대 넓이와 가로 세로 길이를 저장하고 for문으로 하나하나 순회하면서,
명함을 수납하는 두 경우(기본, 돌리는 경우) 계산 ->
1) 둘 중 하나라도 기존 max size 사각형 안에 들어가는 경우 : continue (수납 가능)
2) 둘 다 안되는 경우,즉 수납 불가능한 경우
1. 둘 모두 계산
2. 값을 비교해 작은 값으로 max data update
원리는 간단한데 구현에서 계속 실수해서 헤매었다...
구현할 알고리즘을 잘 정리해 두어야 할 것 같다.
<모범답안>
def solution(sizes):
return max(max(x) for x in sizes) * max(min(x) for x in sizes)
...
역시,, 헛수고를 하고 있었던 거였다.
x중에서 max인 것(긴 쪽의 길이)의 max와
x중에서 min인 것(짧은 쪽의 길이)의 max를 곱하면 끝.
ㅎㅎ........
'프로그래머스 > Lv. 1' 카테고리의 다른 글
30. 가장 가까운 같은 글자 (dict의 활용, 관련 함수들) (1) | 2024.07.14 |
---|---|
29. 시저 암호 ★ (ord, chr, 간단히 알파벳 순회하기) (1) | 2024.07.14 |
27. 삼총사 (itertools - combinations) (0) | 2024.07.12 |
26. 이상한 문자 만들기 (enumerate) (0) | 2024.07.12 |
25. 3진법 뒤집기 ★ (10진법 -> 3진법, 3진법 -> 10진법) (0) | 2024.07.12 |