뭐 다들 아시다시피 제 블로그는 알고리즘 문제만 올리는 블로그이다보니

자동화를 아주 빡세게 붙여놓은 상태입니다.

 

근데 뭐가 문제냐하면 이게 윈도우 기반으로 만들어놓은 자동화라 이말이에요.

그래서 화면을 캡처후에 이름을 바꾸면서 저장하기 쉬워야하는데 맥이 이게 불편합니다.

 

그래도 전능에서는 윈도우를 사용했으니 가끔 문제를 풀어서 캡처해서 올릴 수 있었지만

이번에 이직한 크리마는 맥만 사용하기 때문에 그게 불가능해졌습니다.

 

그래서 당분간 블로그도 쉬어야할 것 같은 느낌이 듭니다....

 

해결책을 찾기 전까지는.... 뭐 물론 지금도 캡처하고 그 폴더 들어가서 이름 바꾸고 위치 바꾸고 하면서 할 수는 있지만

이미 자동화에 너무 익숙해져버린.... 나였기에....

 

이 귀찮음을 잘 해결해줄 수 있는 툴을 찾아봐야겠다....

2022년 10월 28일 금요일 - 오랜만이구만


오늘 올려볼 문제는 49번 Group Anagrams 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

생각을 더해서 어렵게 풀려고 했었다..


입력


사진에서도 볼 수 있듯이 String 배열 1개가 입력으로 들어온다.



풀이 및 코드


같은 anagram인 String들끼리 모아서 리스트로 리턴하는 문제다.


오늘은 처음부터 정답을 생각해냈다.

Char 배열을 기준으로 개수를 세주고 이를 HashMap의 키로 사용하는 방식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        var countSet = new HashMap<String, ArrayList<String>>();
        
        for(var str: strs) {
            var keyArr = new char[26];
            
            for(var c : str.toCharArray()) keyArr[c - 'a']++;
            
            String key = new String(keyArr);
            
            if(!countSet.containsKey(key)) countSet.put(key, new ArrayList<>());
            
            countSet.get(key).add(str);
        }
        
        List<List<String>> result = new ArrayList<>();
        
        for(var keySet : countSet.entrySet()) result.add(keySet.getValue());
        
        return result;
    }
}




제출 화면

leetcode 문제 맞았습니다


이제 꽤나 중요한 시기는 지나있는 상황이 됐다.

인생에서 한 번의 전환점이라 생각하고 열심히 살아야겠다!


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 10월 14일 금요일 - 금요일 조아!


오늘 올려볼 문제는 2095번 Delete the Middle Node of a Linked List 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

내일 화이팅합시다!!


입력


사진에서도 볼 수 있듯이 LinkedList의 head 노드가 입력으로 들어온다.



풀이 및 코드


해당 LinkedList의 중간 노드를 끊어서 리턴하는 문제다.


오늘은 처음부터 정답을 생각해냈다.

토끼와 거북이 알고리즘을 사용해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public ListNode deleteMiddle(ListNode head) {
        if(head.next == null) return null;
        
        ListNode s = head, f = head, pre = null;
        
        while(true) {
            f = f.next;
            if(f == null) {
                pre.next = s.next;
                break;
            }
            
            f = f.next;
            if(f == null) {
                s.next = s.next.next;
                break;
            }
            
            pre = s;
            s = s.next;
        }
        
        return head;
    }
}




제출 화면

leetcode 문제 맞았습니다


휴 이제 내일인데... 잘 할수 있을지 모르겠다....

쨌든 최선을 다해보자!!!


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 10월 12일 수요일 - 열심히 준비하자!!


오늘 올려볼 문제는 976번 Largest Perimeter Triangle 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

드디어 리팩토링 기간!! 너무 좋아!!


입력


사진에서도 볼 수 있듯이 int 배열 1개가 입력으로 들어온다.



풀이 및 코드


주어진 배열에서 3개의 원소를 골라 삼각형을 만들었을 때 둘레가 가장 긴 삼각형의 둘레를 구하는 문제이다.


오늘은 처음부터 정답을 생각해냈다.

정렬한 후에 뒤에서부터 삼각형이 가능한지 판단하고 삼각형이 가능하면 바로 리턴해줬다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int largestPerimeter(int[] nums) {
        Arrays.sort(nums);
        for(int i = nums.length - 3; i >= 0; i--) {
            if(nums[i] + nums[i + 1] > nums[i + 2]) return nums[i] + nums[i + 1] + nums[i + 2];
        }
        return 0;
    }
}




제출 화면

leetcode 문제 맞았습니다


요즘 시기적으로 중요한 시기인데 힘내서 좋은 결과 얻었으면 좋겠다!


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 10월 04일 화요일 - 번아웃? 아닌가?


오늘 올려볼 문제는 112번 Path Sum 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

뭔가 요즘 열심히는 사는데 뭘 위한건지 잘 모르겠다


입력


사진에서도 볼 수 있듯이 Binaray Tree의 Root Node가 입력으로 들어온다.



풀이 및 코드


Leaf 노드까지 합을 구했을 때 targetSum을 만들 수 있는 path가 있는지 판단하는 문제댜.


오늘은 처음부터 정답을 생각해냈다.

bfs를 사용해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if(root == null) return false;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        while(!q.isEmpty()) {
            int size = q.size();
            
            for(int i = 0; i < size; i++) {
                TreeNode now = q.poll();
                
                if(isLeaf(now) && now.val == targetSum) return true;
                
                if(now.left != null) {
                    now.left.val += now.val;
                    q.add(now.left);
                }
                
                if(now.right != null) {
                    now.right.val += now.val;
                    q.add(now.right);
                }
            }
        }
        
        return false;
    }
    
    private boolean isLeaf(TreeNode node) {
        return node.left == null && node.right == null;
    }
}




제출 화면

leetcode 문제 맞았습니다


음.. 뭐랄까 진로가 정해진게 얼마 안됐으니 잘 모르는게 많은게 당연하지만.. 그 사이 간격을 빠르게 좁히고 싶은 마음이 큰 시기인거 같다.

그런 의미에서 오늘은 천천히 쉬어가는 날인걸로.


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 09월 29일 목요일 - 어제 다비치 영접함!!


오늘 올려볼 문제는 658번 Find K Closest Elements 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

오랜만에 올리는 미디엄 문제같네...


입력


사진에서도 볼 수 있듯이 정렬된 int 배열 1개와 int 값 2개가 입력으로 들어온다.



풀이 및 코드


x와 가장 가까운 원소들로만 이루어진 길이가 k인 subarray를 찾는 문제이다.

이 때 차이는 절대값으로 판별하고 절대값이 작을 때는 원소가 더 작은쪽을 택한다.


오늘은 처음부터 정답을 생각해냈다.

Queue에 원소들을 넣어두고 넣은 값들과 x 차이의 합을 구한다.

이후 window slide를 사용하여 합이 커지는 순간 직전까지 찾고 리턴하는 방식으로 구현했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public List<Integer> findClosestElements(int[] arr, int k, int x) {
        Queue<Integer> q = new LinkedList<>();
        int sum = 0;
        for(int i = 0; i < k; i++) {
            q.add(arr[i]);
            sum += Math.abs(arr[i] - x);
        }
        
        for(int i = k; i < arr.length; i++) {
            int num = Math.abs(arr[i] - x) - Math.abs(q.peek() - x);

            if(0 <= num && q.peek() < arr[i]) break;
            
            q.poll();
            q.add(arr[i]);
            sum += num;
            continue;
        }
        
        return (List)q;
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘 자바 서버가 별로 안좋은지 속도가 생각보다 안나온다.


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 09월 22일 목요일 - 와 너무 오랜만!


오늘 올려볼 문제는 557번 Reverse Words in a String III 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

아니 요즘 바빠서 회사에서 문제 풀 수가 없어...


입력


사진에서도 볼 수 있듯이 String 한 개가 입력으로 들어온다.



풀이 및 코드


공백을 기준으로 단어들을 나누고 단어의 순서는 유지하되 단어는 뒤집은 String을 리턴하는 문제다.


오늘은 처음부터 정답을 생각해냈다.

공백기준으로 String을 나누고 각자 reverse를 해줘야 하는데 String 메소드에는 없어서 sb로 감싸는 함수를 만들어서 처리했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = new StringBuilder();
        for(String str : s.split(" ")) sb.append(reverse(str) + " ");
        return sb.toString().trim();
    }
    
    public String reverse(String s) {
        return new StringBuilder(s).reverse().toString();
    }
}




제출 화면

leetcode 문제 맞았습니다


아니 어떻게 String 메소드에 reverse가 없는지 도저히 이해를 할 수가 없다.

코틀린이 너무 편해~~


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

2022년 09월 08일 목요일 - 으아아아아아 이제 4일동안 쉰다!!!!!


오늘 올려볼 문제는 94번 Binary Tree Inorder Traversal 이라는 문제이다.


사진을 클릭하면 해당 문제로 이동합니다.

leetcode 문제 사진

오늘도 LeetCode 사이트 오늘의 문제를 가지고 왔다.

너무 쉽자너


입력


사진에서도 볼 수 있듯이 Binary Tree의 Root Node가 입력으로 들어온다.



풀이 및 코드


해당 트리를 inorder traversal 한 결과를 리턴하는 문제다.


오늘은 처음부터 정답을 생각해냈다.

뭐 이정도는 기본이니 설명은 생략하겠다.


이제 코드를 봐보자!


풀이코드

class Solution {
    List<Integer> result = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        inOrder(root);
        return result;
    }
    
    public void inOrder(TreeNode root) {
        if(root == null) return;
        
        inOrder(root.left);
        
        result.add(root.val);
        
        inOrder(root.right);
    }
}




제출 화면

leetcode 문제 맞았습니다


이제 트리 좀 그만....


내일도 문제를 풀어서 블로그에 글을 쓸 수 있으면 좋겠다.

+ Recent posts