Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 스파르타코딩클럽 #코딩 #jQuery #Ajax
- 부트스트랩 #Bootstrap #웹개발첫걸음 #스파르타코딩클럽
- 항해99솔직후기 #항해99 #부트캠프추천
- #내일배움단 #코딩프로젝트 #국비지원 #내일배움카드 #스파르타코딩클럽
- 스파르타코딩클럽 #크롤링 #스크래핑
Archives
- Today
- Total
이모저모
leetcode - largest-number (삽입정렬의 특성) 본문
처음 문제를 봤을 때, 맨 앞자리가 큰 것을 우선 앞에 가져와야겠다 라는 것은 단순하게 생각할 수 있는데, 그 다음을 비교하는 과정이 잘 안 그려졌다. 고민을 하다가, 그래 한 번에 다 해결하지 못한다면, 작게 시도할 수 있는 첫 작업이라도 먼저 해보자 싶었다.
그래서 우선 "앞자리가 큰 아이들부터 앞쪽에 다 모여!" 이런 식으로 해놓았다.
그러고 나니, 이제는 앞에 자리가 큰 친구들끼리는 서로 앞 뒤를 바꾸어 조합해보면서 더 큰 경우가 되도록 스왑해주면 되겠다고 생각했다.
그래서 결국 나는 두 번의 정렬을 사용하게 되었는데, 사실 문제를 푸는 데 첫 번째 정렬은 꼭 필요하지는 않다.
그래도 문제가 복잡하게 느껴지던 차에 조금 더 도움을 준 친구니까 나에게는 살짝 고마운 단계였다...!ㅎㅎㅎ
그래도 불필요한 코드는 지우는게 낫겠다 싶어서 1차 정렬을 지우고 다시 돌려보았다.
이렇게 해보니까 (나한테는) 신기한 사실을 발견했는데,
1단계의 예비(?)적 정렬을 시키는 코드로 돌렸을 때가 더 빨랐다는 것..!
이 상황을 마주하고 나니까, 전에 나동빈님 영상에서 배웠던 사실이 기억이 났다.
삽입정렬은 필요시에만 스왑하기 때문에, 거의 정렬된 상태의 자료일 경우 그 속도가 더 빠르다는 것이었다.
심지어 "거의 정렬되어 있으면 퀵정렬보다도 삽입정렬이 빠를 수 있다"라고 했었는데,
정말 정렬된 상태에서 삽입정렬의 처리 속도가 빠르구나 싶었다.
삽입정렬의 특성을 조금 더 배우게 된 계기가 되었다:)
0. 문제
1. 코드
class Solution(object):
def largestNumber(self, nums):
# 0만 들어왔을 경우에 대한 예외 처리
# ([0,0] -> output: "0" 이어야 한다고 함)
if max(nums) == 0:
return "0"
# 일단 맨 앞자리 숫자가 큰것들을 앞쪽으로 둔다.
str_nums = list(map(str, nums))
str_nums.sort(key=lambda x: x[0], reverse=True)
# 이제 삽입 정렬을 사용해서, 인접한 두 수를 바꾸어 조합했을 때 더 큰 수가 나오도록
# 필요하다면 스왑해간다.
for cur in range(1, len(str_nums)):
# 두번째 수부터 비교 시작
for delta in range(1, cur + 1):
# 비교대상이 될 친구는 자기보다 바로 앞(delta = 1)일때부터 맨 첫 번째아이([0])까지 가야 하니까
# (물론 그렇게 앞으로 비교대상이 진행한다면, 비교가 될 나도 계속 스왑으로 인해 하나씩 앞으로 가는 것이고)
# 그러면 원래 나의 값은 [cmp +1]의 인덱스로 가리켜 볼 수 있음.
cmp = cur - delta
# <앞선 친구 - 나>를 조합해서 만든 수의 크기와, <나-앞서있던친구> 조합으로 만든 수의 크기를 비교해봄!
# 만약 순서를 바꿔야 더 크다면, 바꾸기!
if int(str_nums[cmp] + str_nums[cmp + 1]) < int(str_nums[cmp + 1] + str_nums[cmp]):
str_nums[cmp], str_nums[cmp + 1] = str_nums[cmp + 1], str_nums[cmp]
else:
break
# 하나의 문자열로 제출
answer = "".join(map(str, str_nums))
return answer
'coding > 알고리즘,자료구조' 카테고리의 다른 글
연결리스트에 대한 삽입정렬 (0) | 2022.01.31 |
---|---|
bottom-up 동적 계획법 연습 (0) | 2022.01.29 |
간단한 예제로 동적계획법 복습 (0) | 2022.01.29 |
디스크 컨트롤러 - heap 문제 (프로그래머스) (0) | 2022.01.29 |
top-down, 재귀, 메모이제이션 (0) | 2022.01.28 |
Comments