2022년 04월 07일 목요일 - 오늘은 생일!!


오늘 올려볼 문제는 1046번 Last Stone Weight 이라는 문제이다.


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

leetcode 문제 사진

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

뭔가 깔삼하게 풀지는 모태서...


입력


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



풀이 및 코드


가장 큰 수 2개씩 없애서 마지막에 남는 값을 리턴하는 문제다.

수를 없애는 규칙은 두 수가 같을 때는 둘 다 없애고 아닐 때는 큰 수에서 작은 수를 뺀 값만 남긴다.


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

priority queue에 넣고 규칙대로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int lastStoneWeight(int[] stones) {
         PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        for(int num : stones) pq.add(num);

        while(pq.size() > 1)
        {
            int n1 = pq.poll();
            int n2 = pq.poll();

            if(n1 == n2) continue;

            pq.add(n1 - n2);
        }

        return pq.size() == 0 ? 0 : pq.poll();
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘 문제는 nlogn으로 풀어서 살짝 멋이 없었다.

내일은 멋있게 풀어봐야겠다!


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

2022년 04월 06일 수요일 - 회식 다음날은 너무 힘들다...


오늘 올려볼 문제는 923번 3Sum With Multiplicity 이라는 문제이다.


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

leetcode 문제 사진

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

오늘 뇌가 굳은거 가타따..


입력


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



풀이 및 코드


인덱스 i, j, k 가 i < j < k 를 만족하면서 모두 더한 값이 target이 되는 경우의 수가 몇인지 구하는 문제다.


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

각 숫자의 개수를 저장한다.

i, j는 for문을 돌면서 찾고 k는 target에서 i, j를 뺀 값으로 찾는다.

i == j == k 일 때, i == j != k 일 때, j < k 일 때를 나누어서 계산하는 방법으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int threeSumMulti(int[] nums, int target) {
        long[] count = new long[105];
        int mod = 1000000007;
        long result = 0;

        for(int num : nums) count[num]++;

        for(int i = 0; i <= 100; i++)
        {
            for(int j = i; j <= 100; j++)
            {
                int k = target - i - j;
                if(k > 100 || k < 0) continue;

                if(i == j && j == k)
                {
                    result += count[i] * (count[i] - 1) * (count[i] - 2) / 6;
                }
                else if(i == j && j != k)
                {
                    result += count[i] * (count[i] - 1) / 2 * count[k];
                }
                else if(j < k)
                {
                    result += count[i] * count[j] * count[k];
                }
            }
        }

        return (int)(result % mod);
    }
}




제출 화면

leetcode 문제 맞았습니다


어제 회식의 여파로 머리가 굳은 거 같아서 꽤 힘들게 문제를 풀었다.

내일은 좀 잘 풀었으면 좋겠다.


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

2022년 04월 04일 월요일 - 왜... 월요일...?


오늘 올려볼 문제는 1721번 Swapping Nodes in a Linked List 이라는 문제이다.


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

leetcode 문제 사진

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

아니 Value만 바꿔도 되는거 왜 안알려줬어!!!!


입력


사진에서도 볼 수 있듯이 Linked List 1개와 int값 1개가 입력으로 들어온다.



풀이 및 코드


앞에서 k번째 node와 뒤에서 k번째 node를 바꾸어서 리턴하는 문제다.


오늘은 시행착오를 좀 겪었다.

정석적으로 바꾸려는 node들의 앞뒤를 저장해서 이어주고 떼주고... 하다가 너무 힘들어서 HashMap을 사용해서 indexing을 하고 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public ListNode swapNodes(ListNode head, int k) {
        HashMap<Integer, ListNode> map = new HashMap<>();
        int length = 0;
        ListNode start = head, end = head;

        for(;start != null; start = start.next)
        {
            length++;
            map.put(length, start);
        }

        if(length == 1) return head;

        if(k > length / 2) k = length - k + 1;

        if(length == 2)
        {
            map.get(1).next = null;
            map.get(2).next = map.get(1);

            return map.get(2);
        }
        else if(k == 1)
        {
            map.get(1).next = null;
            map.get(length).next = map.get(2);
            map.get(length - 1).next = map.get(1);

            return map.get(length);
        }
        else if(2 * k == length)
        {
            map.get(k - 1).next = map.get(k + 1);
            map.get(k + 1).next = map.get(k);
            map.get(k).next = map.get(k + 2);

            return head;
        }
        else
        {
            map.get(k - 1).next = map.get(length - k + 1);
            map.get(length - k + 1).next = map.get(k + 1);
            map.get(length - k).next = map.get(k);
            map.get(k).next = map.get(length - k + 2);

            return head;
        }
    }
}




제출 화면

leetcode 문제 맞았습니다


사실 value만 바꿔도 되는줄 알았으면 훨씬 쉽게 문제를 풀었을 것이다.

내일은 좀 꼼수를 부리더라도 편하게 풀어야겠다.


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

2022년 2월 25일 금요일 - 역시 금요일이 최고지


오늘 올려볼 문제는 165번 Compare Version Numbers 이라는 문제이다.


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

leetcode 문제 사진

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

아니 제약조건 잘못봐서 더 안좋게 품...


입력


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



풀이 및 코드


주어진 String 들은 각각 버전을 나타내는 데 이를 비교하여 리턴하는 문제이다.


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

사실 별거없이 직관적으로 문제를 풀면된다.

다만 난 제약조건을 잘못봐서 BigInteger를 사용해서 풀었지만 Integer를 사용해서 풀어도 된다.


이제 코드를 봐보자!


import java.math.BigInteger;
class Solution {
    public int compareVersion(String version1, String version2) {
        String[] arr1 = version1.split("[.]");
        String[] arr2 = version2.split("[.]");

        BigInteger b1 = new BigInteger("0");
        BigInteger b2 = new BigInteger("0");

        for(int i = 0; i < (arr1.length > arr2.length ? arr1.length : arr2.length); i++)
        {
            if(i >= arr1.length)
            {
                b1 = BigInteger.valueOf(0);
            }
            else
            {
                b1 = new BigInteger(arr1[i]);
            }

            if(i >= arr2.length)
            {
                b2 = BigInteger.valueOf(0);
            }
            else
            {
                b2 = new BigInteger(arr2[i]);
            }

            if(b1.compareTo(b2) > 0)
            {
                return 1;
            }
            else if(b1.compareTo(b2) < 0)
            {
                return -1;
            }
        }

        return 0;
    }
}



제출 화면

leetcode 문제 맞았습니다


오늘은 더 메모리를 적게 쓰고 풀 수 있었지만 제약 조건을 제대로 안읽어서 메모리를 더 쓴 문제다.

다음에는 제약조건을 제대로 읽어야겠다.


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

2022년 2월 24일 목요일 - 와우 피곤한걸?


오늘 올려볼 문제는 148번 Sort List 이라는 문제이다.


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

leetcode 문제 사진

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

메모리 O(1)로 푸는건 너무 귀찮아서 걍 O(N)으로 품ㅋㅋㅋ


입력


사진에서도 볼 수 있듯이 리스트 하나가 입력으로 들어온다.



풀이 및 코드


주어진 리스트를 정렬하고 리턴하는 문제이다.


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

리스트로부터 모든 값을 뽑아서 ArrayList에 저장하고 정렬한다.

그리고 이를 다시 리스트로 만드는 식으로 구현했다.


이제 코드를 봐보자!


class Solution {
    public ListNode sortList(ListNode head) {
        ArrayList<Integer> arr = new ArrayList<Integer>();

        if(head == null)
            return head;

        while(head != null)
        {
            arr.add(head.val);
            head = head.next;
        }

        Collections.sort(arr);

        ListNode root = new ListNode();
        ListNode result = root;

        for(int i = 0; i < arr.size(); i++)
        {
            ListNode temp = new ListNode();
            root.next = temp;
            root = temp;
            root.val = arr.get(i);
        }

        return result.next;
    }
}



제출 화면

leetcode 문제 맞았습니다


오늘은 더 까다롭게 풀 수 있는 문제였지만 그냥 편하게 풀었다.

사실 귀찮지만 않았다면 시도했을 것이다.


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

2022년 2월 23일 수요일 - 오늘 너무 졸린데...


오늘 올려볼 문제는 133번 Clone Graph 이라는 문제이다.


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

leetcode 문제 사진
leetcode 문제 사진
leetcode 문제 사진

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

오늘 문제는 꽤 귀찮았는데 안귀찮게 푸는 방법이 이써따...


입력


사진에서도 볼 수 있듯이 그래프의 시작 노드 하나가 입력으로 들어온다.



풀이 및 코드


주어진 그래프를 그대로 복사하여 리턴하는 문제다.


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

주어진 그래프를 순회하는 대로 그래프를 만드는 것이다.

이 때 계속 new를 사용하면 제대로 된 복사가 되지 않으므로 val를 기준으로 노드를 저장하고 있다가 연결해주는 방식으로 구현했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    Node result;
    Queue<Node> q = new LinkedList<Node>();

    Node[] nodes = new Node[105];
    boolean[] visit = new boolean[105];

    public Node cloneGraph(Node node) {
        if(node == null)
            return null;

        if(node.neighbors.size() == 0)
            return new Node(node.val);

        result = new Node(node.val);
        nodes[result.val] = result;

        dfs(node);

        return result;
    }

    public void dfs(Node root)
    {
        if(visit[root.val])
            return;

        visit[root.val] = true;

        Node temp;
        for(int i = 0; i < root.neighbors.size(); i++)
        {
            temp = result;

            if(nodes[root.neighbors.get(i).val] == null)
                nodes[root.neighbors.get(i).val] = new Node(root.neighbors.get(i).val);
            result.neighbors.add(nodes[root.neighbors.get(i).val]);
            result = result.neighbors.get(i);
            dfs(root.neighbors.get(i));

            result = temp;
        }
    }
}



제출 화면

leetcode 문제 맞았습니다


오늘은 문제가 귀찮았다.

하지만 귀찮지 않게 푸는 방법이 있었던 것을 보면 뭔가 귀찮다 싶으면 짧게 풀 수도 있겠구나 생각을 해야겠다.


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

2022년 2월 22일 화요일 - 일주일의 시작은 쉬운문제로 해주는 leetcode... 당신 친절할지도..?


오늘 올려볼 문제는 171번 Excel Sheet Column Number 이라는 문제이다.


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

leetcode 문제 사진

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

아니 왜 A를 1로 둬서 귀찮게 하는데


입력


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



풀이 및 코드


A를 1로, Z를 26으로 봐서 주어진 String을 26진법으로 봐서 숫자로 변환하고 리턴하는 문제이다.


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

각 index에 해당하는 char의 아스키코드 값을 구하고 처리하는 방식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int titleToNumber(String columnTitle) {
        int result = 0;

        for(int i = 0; i < columnTitle.length(); i++)
        {
            result += (int)(Math.pow(26, columnTitle.length() - 1 - i) * (columnTitle.charAt(i) - 'A' + 1));
        }

        return result;
    }
}



제출 화면

leetcode 문제 맞았습니다


오늘도 문제가 너무 쉬워서 빨리 풀었다.

내일은 적당히 어려우면서 재밌는 문제가 나오길 바란다.


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

2022년 2월 21일 월요일 - 아니 왜 벌써 월요일?


오늘 올려볼 문제는 169번 Majority Element 이라는 문제이다.


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

leetcode 문제 사진

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

1분컷 해버리기


입력


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



풀이 및 코드


주어진 배열의 원소 중 빈도수가 배열 총 원소들 개수의 절반 이상인 원소를 찾아서 리턴하는 문제이다.


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

해쉬맵에 개수를 넣고 개수가 절반 이상이 되면 리턴하는 식으로 구현했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int majorityElement(int[] nums) {
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();

        int size = nums.length / 2 + (nums.length % 2 == 0 ? 0 : 1);

        for(int num : nums)
        {
            if(!map.containsKey(num))
                map.put(num, 0);

            map.put(num, map.get(num) + 1);

            if(map.get(num) >= size)
                return num;
        }

        return 0;
    }
}



제출 화면

leetcode 문제 맞았습니다


오늘은 문제가 너무 쉬워서 빨리 풀었다.

적당히 어려우면서 재밌는 문제가 나오길 바란다.


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

+ Recent posts