2023년 01월 27일 금요일 - 아니 왤케 추워...


오늘 올려볼 문제는 472번 Concatenated Words 이라는 문제이다.


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

leetcode 문제 사진

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

하드치고는 너무 쉽게 풀어버림...


입력


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



풀이 및 코드


주어진 String들을 이어붙였을 때 만들어낼 수 있는 값중 배열에 있는 모든 값들을 찾아서 리턴하는 문제이다.


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

먼저 String의 길이순으로 정렬한다.

이 후 substring으로 잘라가면서 dfs를 하는 식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    HashSet<String> set = new HashSet<>();
    public List<String> findAllConcatenatedWordsInADict(String[] words) {
        var result = new ArrayList<String>();
        Arrays.sort(words, (a, b) -> a.length() - b.length());
        
        for(var w : words) {
            for(int i = 1; i < w.length(); i++) {
                if(set.contains(w.substring(0, i)) && solve(i, w)) {
                    result.add(w);
                    break;
                }
            }
            set.add(w);
        }
        
        return result;
    }
    
    public boolean solve(int start, String word) {
        if(start == word.length()) return true;
        
        for(int i = start + 1; i <= word.length(); i++) if(set.contains(word.substring(start, i)) && solve(i, word)) return true;
        
        return false;
    }
}




제출 화면

leetcode 문제 맞았습니다


이게 되나 싶었는데 이게 됐다... ㄷㄷ


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

2023년 01월 26일 목요일 - 눈이 펑펑 와요


오늘 올려볼 문제는 787번 Cheapest Flights Within K Stops 이라는 문제이다.


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

leetcode 문제 사진

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

오늘 문제 미디엄치고는 어려웠어요...


입력


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



풀이 및 코드


방향 그래프가 주어지고 최대 들를 수 있는 경유지 개수가 주어졌을 때 목적지로 갈 수 있는 방법 중 가장 짧은 길이를 구하는 문제이다.


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

bfs 를 사용하는데 dp를 섞어서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int findCheapestPrice(int n, int[][] flights, int src, int dst, int k) {
        HashMap<Integer, Integer>[] arr = new HashMap[n];
        var v = new int[n];
        int result = Integer.MAX_VALUE;
        
        Arrays.fill(v, Integer.MAX_VALUE);
        
        for(var f : flights) {
            if(arr[f[0]] == null) arr[f[0]] = new HashMap<>();
            
            arr[f[0]].put(f[1], f[2]);
        }
        
        var q = new LinkedList<int[]>();
        q.add(new int[]{src, 0});
        
        for(int i = 0; i <= k + 1; i++) {
            int size = q.size();
            for(int j = 0; j < size; j++) {
                var now = q.poll();
                
                if(now[1] > result || v[now[0]] < now[1]) continue;
                if(now[0] == dst) {
                    result = Math.min(result, now[1]);
                    continue;
                }
                if(arr[now[0]] == null) continue;
                
                v[now[0]] = now[1];
                
                for(var key: arr[now[0]].keySet()) q.add(new int[] {key, arr[now[0]].get(key) + now[1]});
            }
        }
        
        return result == Integer.MAX_VALUE ? -1 : result;
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘 오랜만에 출근해서 그런지 힘드러따...


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

2023년 01월 24일 화요일 - 날씨 실화냐?


오늘 올려볼 문제는 909번 Snakes and Ladders 이라는 문제이다.


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

leetcode 문제 사진

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

생각보다 어려웠던 구현문제..


입력


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



풀이 및 코드


1번부터 시작해서 6까지 있는 주사위를 던져서 맨끝까지 가는 게임이라고 한다.

뱀 또는 사다리가 시작하는 칸에 멈추게 되면 바로 이어져있는 곳으로 이동하게된다고 했을 때 끝가지 갈 수 있다면 가장 적은 횟수를, 갈 수 없다면 -1을 리턴하는 문제이다.


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

일단 판이 그지같으니깐 1차원 배열로 펴준다.

이 후 bfs를 사용하여 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int snakesAndLadders(int[][] board) {
        int n = board.length, index = 1;
        var arr = new int[n * n + 1];
        var v = new boolean[n * n + 1];
        var flag = true;
        
        for(int i = n - 1; i >= 0; i--) {
            if(flag) for(int j = 0; j < n; j++) arr[index++] = board[i][j];
            else for(int j = n - 1; j >= 0; j--) arr[index++] =  board[i][j];
            flag = !flag;
        }
        
        int steps = 0;
        var q = new LinkedList<Integer>();
        q.add(arr[1] == -1 ? 1 : arr[1]);
        
        while(!q.isEmpty()) {
            int size = q.size();
            for(int i = 0; i < size; i++) {
                int now = q.poll();
                if(v[now]) continue;
                v[now] = true;
                
                if(now == n * n) return steps;
                
                for(int j = now + 1; j <= Math.min(now + 6, n * n); j++) q.add(arr[j] == -1 ? j : arr[j]);
            }
            steps++;
        }
        
        return -1;
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘은 날씨가 미친것 같다...

설날 아니었다면 내일 아침 9시 뉴스에 나왔을지도...


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

2023년 01월 23일 월요일 - 아직도 쉰다 ㅎㅎ


오늘 올려볼 문제는 997번 Find the Town Judge 이라는 문제이다.


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

leetcode 문제 사진

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

쉬는날이라서 그런지 자꾸 알고리즘 스터디를 까먹어..


입력


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



풀이 및 코드


아래 조건에 부합하는 사람이 해당 마을의 심판이다.

1. 심판은 누구도 믿지 않는다.
2. 심판을 제외한 모든 마을 주민들은 심판을 믿는다.
3. 1번, 2번 조건을 만족하는 사람은 딱 한명이다.

이 때 심판을 구하는 문제이다.


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

int 배열하나 만들어서 믿음 받는 개수를 구한다.

이 때 믿는 사람은 -1을 넣어서 1번 조건을 만족하게끔 해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int findJudge(int n, int[][] trust) {
        var arr = new int[n + 1];
        for(var t : trust) {
            arr[t[0]] = -1;
            arr[t[1]]++;
        }
        
        for(int i = 1; i <= n; i++) if(arr[i] == n - 1) return i;
        
        return -1;
    }
}




제출 화면

leetcode 문제 맞았습니다


저 코드가 오래걸릴거 같지는 않았는데 순회를 2번 해서 그런지는 몰라도 그렇게 빠른 코드가 아니었다..

leetcode 서버 문제인건지는 잘 모르겠지만 뭐... 그렇다!


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

2023년 01월 21일 토요일 - 설날설날 아주 조아 설날


오늘 올려볼 문제는 93번 Restore IP Addresses 이라는 문제이다.


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

leetcode 문제 사진

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

leetcode extension 다 만들은듯?


입력


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



풀이 및 코드


입력으로 주어진 String으로 만들 수 있는 valid한 ip주소를 전부 찾아서 리턴하는 문제다.


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

백트래킹 사용하는 방식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    String input;
    ArrayList<String> result = new ArrayList<>();
    public List<String> restoreIpAddresses(String s) {
        input = s;
        if(s.length() > 12 || s.length() < 4) return result;
        
        solve(0, 0, "");
        
        return result;
    }
    
    public void solve(int start, int level, String ip) {
        if(level == 4 && start == input.length()) {
            result.add(ip.substring(0, ip.length() - 1));
            return;
        }
        if(level > 4 || start >= input.length()) return;
        
        if(input.charAt(start) == '0') {
            solve(start + 1, level + 1, ip + "0.");
        } else {
            for(int i = 1; i <= 3; i++){ 
                if(start + i > input.length()) continue;
                
                var substring = input.substring(start, start + i);
                
                if(Integer.parseInt(substring) <= 255) solve(start + i, level + 1, ip + substring + ".");
            }
        }
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘 내 submission 창을 보면 엄창나게 많은 wrong들을 볼 수 있는데 leetcode extension을 개발하느라 그랬다.

그래도 어느정도 가닥이 잡힌 것 같으니 더 다듬어서 배포하고 홍보를 해봐야겠다!


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

2023년 01월 20일 금요일 - 어우 연휴 너무 조아!!!!


오늘 올려볼 문제는 491번 Non-decreasing Subsequences 이라는 문제이다.


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

leetcode 문제 사진

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

생각보다는 어려워잉...


입력


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



풀이 및 코드


배열의 subsequnce를 구하는데 해당 subsequnce는 오름차순으로 정렬되어있어야한다. 또한 subsequnce는 unique 해야한다.


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

입력의 크기가 작다보니 브루트포스, 백트래킹 같았다.

unique 함을 처리해야하는데 오름차순인게 주어졌으니 스택과 마지막에 스택에 넣은 값을 기준으로 백트래킹을 진행했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    List<List<Integer>> result = new ArrayList<>();
    int[] arr;
    public List<List<Integer>> findSubsequences(int[] nums) {
        arr = nums;
        
        solve(0, -10000, new Stack<>());
        
        return result;
    }
    
    public void solve(int index, int prev, Stack<Integer> s) {
        if(index == arr.length) {
            if(s.size() > 1) result.add(new ArrayList(s));
            return;
        }
        
        if(prev <= arr[index]) {
            s.push(arr[index]);
            solve(index + 1, arr[index], s);
            s.pop();
        }
        if(prev != arr[index]) solve(index + 1, prev, s);
    }
}




제출 화면

leetcode 문제 맞았습니다


요즘 리트코드가 할만해보이는데 어려운 문제를 자꾸 낸다...

조금만 더 쉽게 내줬으면 ㅠ


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

2023년 01월 17일 화요일 - 아니 개 추워!!!!!


오늘 올려볼 문제는 926번 Flip String to Monotone Increasing 이라는 문제이다.


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

leetcode 문제 사진

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

간단해보였지만 생각보다는 오래걸렸다..


입력


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



풀이 및 코드


Monotone Increasing한 String으로 만들기 위해서 각 원소를 뒤집으라는 문제다.

Monotone Increasing을 찾아봐도 잘 모르겠지만 대충 지수적으로 늘어나는 느낌인 것 같다.

여기서는 "0000", "0001", "0011", "0111", "1111" 처럼 아예 0이나 1로 이루어져 있거나 뒤에가 1로 채워져 있는 상태를 말한다.


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

일단 0개수 1개수를 세고 String을 순회한다.

0이 나오면 지나가고 1이 나오면 앞으로 남은 것들 중에 어떤 숫자를 뒤집어야지 작은게 나오는지 계산한다.

이렇게 최소값을 찾아나가는 방향으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int minFlipsMonoIncr(String s) {
        int n = s.length();
        var oneZero = new int[2];
        
        for(int i = 0; i < n; i++) oneZero[s.charAt(i) == '1' ? 1 : 0]++;

        int result = Math.min(oneZero[0], oneZero[1]), flipedOnes = 0;
        
        for(int i = 0; i < n; i++) {
            oneZero[s.charAt(i) == '1' ? 1 : 0]--;
            
            if(s.charAt(i) == '0') continue;
            
            result = Math.min(result, flipedOnes++ + Math.min(oneZero[0], oneZero[1] + 1));
        }
        
        return result;
    }
}




제출 화면

leetcode 문제 맞았습니다


저기서 0개수 1개수를 세지않고 그냥 순회 한 번 더 하려고 했었다가 TLE 떠서 개수 기억하게끔 후다닥 바꿨다.

간단해보이지만 생각보다 어려운 것 같다.


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

2023년 01월 16일 월요일 - 왜 월요일?


오늘 올려볼 문제는 57번 Insert Interval 이라는 문제이다.


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

leetcode 문제 사진

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

오늘 너무 춥던데...


입력


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



풀이 및 코드


기존 간격들이 있고 새로운 간격이 하나 들어온다고 했을 때 겹치는 부분들을 합치는 문제이다.


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

이미 기존 간격들은 정력되어 있으니 newInterval을 적당한 위치에 넣고 머지하는 식으로 진행했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        if(intervals.length == 0) return new int[][] {newInterval};
        
        var list = new ArrayList<int[]>();
        var temp = new ArrayList<int[]>();
        
        for(var itv: intervals) list.add(itv);
        
        for(int i = intervals.length - 1; i >= 0; i--) {
            if(list.get(i)[0] <= newInterval[0]) {
                list.add(i + 1, newInterval);
                break;
            }
        }
        
        if(list.size() == intervals.length) list.add(0, newInterval);
        
        
        int index = 0;
        temp.add(list.get(0));
        for(int i = 1; i < list.size(); i++) {
            var prev = temp.get(index);
            var now = list.get(i);
            
            if(prev[1] < now[0]) {
                temp.add(now);
                index++;
            } else {
                prev[0] = Math.min(prev[0], now[0]);
                prev[1] = Math.max(prev[1], now[1]);
            }
        }
        
        var result = new int[temp.size()][2];
        for(int i = 0; i < temp.size(); i++) result[i] = temp.get(i);
        
        return result;
    }
}




제출 화면

leetcode 문제 맞았습니다


오늘은 너무 추웠다...

그 잠시 따뜻해졌다고 이 날씨가 춥다니... 인간은 적응의 동물이 맞나보다....


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

+ Recent posts