본문 바로가기

Web development131

[LeetCode] 2. Add Two Numbers (javascript) 두 Linked List를 더해주는 문제다. 리스트가 integer 크기 제한보다 길 때도 있으므로 BigInt를 사용했다. /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var addTwoNumbers = function (l1, l2) { let l = ''; let ll = ''; while (l1) { l = l1... 2021. 5. 31.
[LeetCode] 200. Number of Islands (javascript) 주어진 2차 배열에서 "1"은 육지, "0"은 바다를 나타낸다. 육지 덩어리의 갯수를 세는 문제다. 1을 찾고, 그 1에 상하좌우로 연결된 1들을 재귀함수로 모두 찾아내어 -1로 바꾸어준다. 한 덩어리를 다 바꾸고나면 count++를 해준다. /** * @param {character[][]} grid * @return {number} */ var numIslands = function (grid) { const m = grid.length; // 4 max i const n = grid[0].length; // 5 max j let temp = grid; let index = findLandIndex(grid, m, n); let count = 0; while (index) { temp = checkF.. 2021. 5. 31.
[LeetCode] 12. Integer to Roman (javascript) 주어진 숫자를 로마자로 변환하는 문제다. 1~3999의 숫자만 변환할 수 있으면 된다. 1의 자리, 10의 자리, 100의 자리, 1000의 자리에서 사용되는 문자열의 종류를 정의해주고, 0~9의 숫자 표현법을 패턴화하여 더해주도록 했다. /** * @param {number} num * @return {string} */ var intToRoman = function(num) { // num은 1~3999이다. const arr = num.toString().split('').reverse(); let result = ''; for (let i = 0; i < arr.length; i++){ result = makeRoman(parseInt(arr[i]), i) + result; } return res.. 2021. 5. 31.
[LeetCode] 43. Multiply Strings (javascript) 주어진 숫자 문자열들을 곱하는 문제다. BigInt를 사용하면 아주 쉽게 풀 수 있다. /** * @param {string} num1 * @param {string} num2 * @return {string} */ var multiply = function(num1, num2) { return (BigInt(num1) * BigInt(num2)).toString(); }; 2021. 5. 31.
[LeetCode] 17. Letter Combinations of a Phone Number (javascript) 전화기의 숫자 버튼 2~9에는 영문자가 적혀 있다. 주어진 숫자로 조합 가능한 영문자 배열을 리턴하는 문제이다. 2번 버튼은 abc, 3번 버튼엔 def라고 적혀있다면 ['a', 'b', 'c'] 를 만들고 배열을 반복을 돌면서 각 요소마다 다음 버튼의 문자열을 붙여주는 방식으로 해결했다. [['ad', 'ae', 'af'], 'b', 'c'] [['ad', 'ae', 'af'], ['bd', 'be', 'bf'], 'c'] [['ad', 'ae', 'af'], ['bd', 'be', 'bf'], ['cd', 'ce', 'cf']] 그리고 배열을 평탄화해준다. 또 다음 버튼이 있다면 평탄화된 배열에 대하여 똑같이 반복한다. 구상은 쉽게 했는데, 중간에 전화기 버튼 객체가 오염되는 문제가 있어 시간을 허비.. 2021. 5. 31.
[LeetCode] ZigZag Conversion (javascript) "ABCDEFGHIJKLMNO" 같은 문자열이 주어졌을 때, numRows만큼의 높낮이로 글자로 지그재그를 그리고, 그 결과를 위에서부터 순서대로 읽어내려가는 문제이다. s = "ABCDEFGHIJKLMNO", numRows = 6인 경우 아래와 같이 된다. 따라서 결과는 AKBJLCIMDHNEGOF여야 한다. index의 간격을 살펴보면, numRows가 6일 때 첫째줄은 10 - 10 - 10 ... 둘째줄은 8-2-8-2 ... 셋째줄은 6-4-6-4 ... 넷째줄은 4-6-4-6 ... 다섯째줄은 2-8-2-8 ... 마지막줄은 다시 10씩 차이난다. 10 8-2 6-4 4-6 2-8 10 으로 반복됨을 알 수 있다. 어느 줄이나 반복되는 간격들의 합은 10이라는 점도 알 수 있다. 따라서 첫번째.. 2021. 5. 19.
[Javascript] 객체 수정시 원본이 변경되는 문제(얕은 복사와 깊은 복사) 자바스크립트의 값의 종류는 원시값과 참조값이 존재한다. Boolean, String, number, null, undefined : 원시값 Object, Array : 참조값 원시값의 경우 새로운 변수에 할당시 값 자체가 할당되고, 참조값은 값의 주소가 할당된다. 그러므로 새로운 변수에 할당 후 수정하면, 객체나 배열의 경우 원본의 값이 변경되어버린다. const obj = {'a': 1, 'b': 2}; const tempObj = obj; tempObj.a = 3; console.log(obj); // {'a': 3, 'b': 2} 문제 문제는, formData의 변경이 필요할때 등 원본을 보존하는 복사가 필요한 경우가 생긴다. 예를 들면, 아래와 같은 form 데이터가 있다. formData = {.. 2021. 5. 6.
[LeetCode] Palindrome Linked List (javascript) 연결리스트가 펠린드롬인지 확인하는 문제다. 배열로 변환하는 꼼수를 써서 풀었으므로.. 좀 더 문제의 의도에 맞는 풀이를 생각해 봐야겠다. /** * 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 {boolean} */ var isPalindrome = function(head) { // 꼼수 풀이긴 하다... // 배열로 변환한다. const arr = toArray(head); // 0개, 1.. 2021. 2. 26.
[LeetCode] Merge Two Sorted Lists (javascript) 연결 리스트 두 개를 값이 작은 순서대로 정렬하여 합친다. 두 리스트는 이미 정렬되어 있으므로, 값을 비교해서 작은 값을 새 리스트에 추가해 나가면 된다. /** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } */ /** * @param {ListNode} l1 * @param {ListNode} l2 * @return {ListNode} */ var mergeTwoLists = function(l1, l2) { // 빈 리스트가 있다면 합칠 필요가 없다. if(!.. 2021. 2. 26.