일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Bellman-Ford
- hash
- Leedcode
- 구현
- Union Find
- dfs
- Java
- python3
- hash table
- Hashtable
- sorting
- array
- leetcode
- A* Algorithm
- heap
- SinglyLinkedList
- DailyLeetCoding
- greedy
- VCS
- BFS
- String
- Easy
- Medium
- graph
- LinkedList
- Two Pointers
- 자료구조
- ArrayList vs LinkedList
- 광연자동차운전면허학원
- stack
- Today
- Total
Min IT's Devlog
[python3] 1470. Shuffle the Array 본문
풀이 일자: 23.02.06
난이도: [Easy]
분류: [Array]
문제 내용
[x1,x2,...,xn,y1,y2,...,yn]이 주어지면 [x1,y1,x2,y2,...,xn,yn]으로 변환하는 문제
문제 해결 흐름
1. 단순하게 생각
→ ans용 array를 하나 만들어서 0부터 n-1을 순회해 가면서 i번째와 i+n번째 수를 배열에 넣어가면 완성.
다른 해결 방식
1. 단순하게 생각하면 매우 쉽지만 만약 in-place로 풀어야 한다면?(만약 새로 배열을 만들 수 없는 메모리만 제공한다면?)
→ bit를 이용하자..
현재 숫자의 크기 조건이 (1 <= nums[i] <= 10^3) 1000 = 1111101000(2)
즉 해당 숫자를 나타내는 메모리 공간 중 실질적으로 10bit만 사용하게 됨.(물론 부호비트가 있다면 11bit를 사용한다고 보겠지만)
2. 그렇다면 2개의 숫자를 하나의 메모리 공간에 저장을 해서 모아둔 다음에 뒤에서부터 다시 채워나가면 되지 않을까?
1) 기존 저장 상태
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
↓
2) arr[i] = ( arr[i] << 10) + arr[i+n] 을 통해 하나의 메모리 공간에 2개의 수를 저장한다.
1,6 | 2,7 | 3,8 | 4,9 | 5,10 |
↓
3)맨 오른쪽 10bit가 y를 나타내므로 1111111111(2) 와 and 연산을 하면 b만 나타난다. 그다음 10bit는 x를 나타내므로 10bit만큼 right shift(>>)해주면 a가 나타난다. 이를 뒤에서부터 채운다.(해당 정보를 가지고 있는 것이 앞에 있으므로 뒤에서부터 채운다면 replace 되더라도 그 데이터는 이미 쓴 데이터이기 때문에 상관없게 된다.)
nums[2*(n-i)-1] = nums[n-i-1] & 1023;
nums[2*(n-i-1)] = nums[n-i-1] >> 10;
1,6 | 2,7 | 3,8 | 4,9 | 5,10 | 5 | 10 |
↓
1 | 6 | 2 | 7 | 3 | 8 | 4 | 9 | 5 | 10 |
=> 매우 쉬운 문제로 코딩테스트에서 나올 일이 없을 것 같은 문제이긴 하지만 만약에 나온다면 숫자의 범위와 메모리 크기를 보는 등 출제의도를 파악하는 것이 중요할 것 같다.
문제 링크
https://leetcode.com/problems/shuffle-the-array/
Shuffle the Array - LeetCode
Shuffle the Array - Given the array nums consisting of 2n elements in the form [x1,x2,...,xn,y1,y2,...,yn]. Return the array in the form [x1,y1,x2,y2,...,xn,yn]. Example 1: Input: nums = [2,5,1,3,4,7], n = 3 Output: [2,3,5,4,1,7] Explanation: Since x1=2
leetcode.com
'코테 > LeetCode(Solve)' 카테고리의 다른 글
[python3] 45. Jump Game II (0) | 2023.02.08 |
---|---|
[python3] 904. Fruit Into Baskets (0) | 2023.02.07 |
[python3] 1626. Best Team With No Conflicts (0) | 2023.02.03 |
[python3] 1328. Break a Palindrome (0) | 2022.10.11 |
[python3] 1996. The Number of Weak Characters in the Game (0) | 2022.09.09 |