diff --git a/raejun/MajorityElement.js b/raejun/MajorityElement.js new file mode 100644 index 0000000..23bf2c1 --- /dev/null +++ b/raejun/MajorityElement.js @@ -0,0 +1,43 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var majorityElement = function (nums) { + if (nums.length === 1) return nums[0]; + + nums.sort((a, b) => a - b); + + let start = nums.at(0); + const end = nums.at(-1); + + let max = 0; + + for (let i = 1; i < nums.length; i++) { + if (start !== nums[i]) { + if (i > max) max = i; + + start = nums[i]; + } else if (end === nums[i]) { + if (nums.length - i > max) max = nums.length - i; + + break; + } + } + + return nums[max]; +}; + +/* +문제 풀지 못함. + +시간 복잡도는 O(n log n)이다. + +배열을 정렬한 후에 풀이하려고 했다. +배열을 정렬한 후에, start와 end를 이용해서 풀이하려고 했다. +start는 배열의 첫 번째 요소로 초기화하고, end는 배열의 마지막 요소로 초기화했다. +배열을 순회하면서 start와 다른 요소가 나오면, 그 요소로 start를 업데이트하고, max를 업데이트했다. +end와 같은 요소가 나오면, max를 업데이트하고 반복문을 종료했다. + +max의 역할을 헷갈려 풀이를 하지 못하였다. +그냥 Map을 이용해서 요소의 개수를 세는 방식으로 풀이하면 더 간단하게 풀이할 수 있었을 것 같다. +*/ diff --git a/raejun/ReverseLinkedList.js b/raejun/ReverseLinkedList.js new file mode 100644 index 0000000..d71377f --- /dev/null +++ b/raejun/ReverseLinkedList.js @@ -0,0 +1,38 @@ +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @return {ListNode} + */ +var reverseList = function (head) { + let newHead = new ListNode(head.val); + + head = head.next; + + while (head) { + let tmp = newHead; + + newHead = head; + newHead.next = tmp; + head = head.next; + } + + return newHead; +}; + +/* +문제 풀지 못함. + +시간 복잡도는 O(n)이다. + +새로운 노드를 생성해서 링크드 리스트를 방식으로 풀이하려고 했다. +head = head.next 한 뒤에, 그 다음 루프에서 head = head.next를 할 때 이미 head.next를 바꿔버려 문제가 생긴다. +다른 사람들의 풀이를 보면, prev, cur, next를 이용해서 풀이한 것을 볼 수 있다. +prev는 이전 노드를 가리키고, cur는 현재 노드를 가리키고, next는 다음 노드를 가리킨다. +루프를 돌면서 cur.next를 prev로 바꿔주고, prev와 cur를 한 칸씩 이동시키는 방식으로 풀이한다. +*/