2023년 11월 13일 월요일 - 아니 이게 얼마만이야!!


오늘 올려볼 문제는 2785번 Sort Vowels in a String 이라는 문제이다.


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

leetcode 문제 사진

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

진짜 오랜만에 푸는데 1트여서 기분 좋음 ㅋㅋ


입력


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



풀이 및 코드


주어진 String에서 모음만을 정렬해서 리턴하는 문제이다.


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

모음만 따로 저장해서 정렬하고 그 순서대로 채워주는 식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public String sortVowels(String s) {
        var set = new HashSet<Character>(Arrays.asList('A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'));
        var vowelArr = new ArrayList<Character>();
        var arr = s.toCharArray();
        
        for(var c : arr) 
            if(set.contains(c)) 
                vowelArr.add(c);
        
        Collections.sort(vowelArr);
        
        int index = 0;
        for(int i = 0; i < arr.length; i++) 
            if(set.contains(arr[i])) 
                arr[i] = vowelArr.get(index++);
        
        return new String(arr);
    }
}




제출 화면

leetcode 문제 맞았습니다


진짜 오랜만에 문제를 풀고 올리는데 느낌이 새롭다 ㅋㅋㅋㅋ

이제 프로젝트도 시작해보려고 하니 자주는 못올리겠지만 간간히 올려봐야지!!


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

2023년 07월 10일 월요일 - 와아아악 오랜만!!


오늘 올려볼 문제는 111번 Minimum Depth of Binary Tree 이라는 문제이다.


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

leetcode 문제 사진

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

최근에 바쁘기도 했고... 문제가 어려워서 못풀기도 했고...


입력


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



풀이 및 코드


leaf node 중 root와 가장 가까운 node의 level을 구하는 문제이다.


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

dfs로 내려가면서 leaf node 일 때와 아닐 때를 분기처리하여 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        
        var left = minDepth(root.left);
        var right = minDepth(root.right);
        
        if(left == 0 && right == 0) return 1;
        if(left != 0 && right != 0) return Math.min(left, right) + 1;
        
        return Math.max(left, right) + 1;
    }
}




제출 화면

leetcode 문제 맞았습니다


참 별의 별일이 다 있었다.

훈련소에서 귀가 조치도 당해보고 프로젝트도 다시 시작하고 등등

암튼 시간 날 때 블로그도 열심히 써봐야겠다!!

그럼 일단 fly 관련한 글부터 올려야지 ㅎㅎ


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

2023년 06월 07일 수요일 - 으어 오랜만에 회사가니깐 너무 힘들어..


오늘 올려볼 문제는 1318번 Minimum Flips to Make a OR b Equal to c 이라는 문제이다.


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

leetcode 문제 사진

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

생각보다 쉽게 풀림


입력


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



풀이 및 코드


a와 b를 or 연산했을 때 c를 만들기 위해서 a와 b의 비트를 뒤집을 때 가장 적게 뒤집는 수를 구하는 문제이다.


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

어차피 or 연산이므로 각자리의 비트가 다른 자리의 비트에 영향을 주지 못한다.

즉 맨 끝의 비트만 비교하면서 뒤집을 개수를 구하는 식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int minFlips(int a, int b, int c) {
        int result = 0;
        
        while(a > 0 || b > 0 || c > 0) {
            int ar = a % 2, br = b % 2, cr = c % 2;
            a >>= 1; b >>= 1; c >>= 1;
            if(cr == (ar | br)) continue;
            
            if(cr == 1) result++;
            else result += ar + br;
        }
        
        return result;
    }
}




제출 화면

leetcode 문제 맞았습니다


자꾸 블로그 쓰는걸 까먹는거 같다.

요즘따라 집에서 놀기만 하고 싶어진달까나?


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

2023년 06월 04일 일요일 - 낚시가 안된다~~


오늘 올려볼 문제는 547번 Number of Provinces 이라는 문제이다.


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

leetcode 문제 사진

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

오랜만에 빨리 푼듯.. ㅋㅋㅋㅋ


입력


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



풀이 및 코드


도시들의 연결정보가 주어졌을 때 각 집합의 개수가 몇개인지 구하는 문제이다.


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

union find를 활용해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int findCircleNum(int[][] isConnected) {
        int n = isConnected.length;
        var arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = i;
        
        for(int i = 0; i < n; i++) {
            for(int j = i + 1; j < n; j++) {
                if(isConnected[i][j] == 1) {
                    int a = find(arr, i), b = find(arr, j);
                    
                    if(a < b) arr[b] = a;
                    else arr[a] = b;
                }
            }
        }
        
        var set = new HashSet<Integer>();
        for(int i = 0; i < n; i++) set.add(find(arr, i));
        
        return set.size();
    }
    
    private int find(int[] arr, int n) {
        if(arr[n] == n) return n;
        
        return arr[n] = find(arr, arr[n]);
    }
}




제출 화면

leetcode 문제 맞았습니다


오랜만에 정석같은 문제가 나와서 안틀리고 바로 풀 수 있었던 것 같다.


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

2023년 06월 02일 금요일 - 오 6월이네..?


오늘 올려볼 문제는 2101번 Detonate the Maximum Bombs 이라는 문제이다.


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

leetcode 문제 사진

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

아니 요즘 블로그 쓰는걸 완전 까먹어


입력


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



풀이 및 코드


각 좌표들이 폭탄의 중심과 폭발 반경을 나타낸다.

한 폭탄을 터뜨렸을 때 최대한 많이 폭탄을 터뜨릴 수 있는 개수를 구하는 문제이다.


오늘은 조금 헤매다가 문제를 풀었다.

처음에는 union find를 사용하려고 했는데 생각해보니 union find를 하게되면 첫 번째 폭발에 연쇄되어서 폭발하는지 판별이 불가능 했다.

그래서 이후에는 dfs를 활용해서 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public int maximumDetonation(int[][] bombs) {
        var set = new HashSet<Integer>();
        int result = 0;
        
        for(int i = 0; i < bombs.length; i++) {
            if(set.contains(i)) continue;
            
            var dfsSet = dfs(bombs, new HashSet<>(), i);
            
            result = Math.max(result, dfsSet.size());
            
            for(var num : dfsSet) set.add(num);
        }
        
        return result;
    }
    
    private HashSet<Integer> dfs(int[][] bombs, HashSet<Integer> set, int now) {
        set.add(now);
        
        for(int i = 0; i < bombs.length; i++) {
            if(set.contains(i)) continue;
            
            var a = bombs[now];
            var b = bombs[i];
            
            long length = a[2], x = Math.abs(a[0] - b[0]), y = Math.abs(a[1] - b[1]);
            
            if(length * length >= x * x + y * y) dfs(bombs, set, i);
        }
        
        return set;
    }
}




제출 화면

leetcode 문제 맞았습니다


시간 좀 줄여보겠다고 union find를 생각하고 거기에 얽매여서 생각보다 푸는데 오래걸렸다.

다음에는 조금 더 유연하게 생각해봐야겠다.


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

2023년 05월 19일 금요일 - 너무 오랜만에 쓰는구만?


오늘 올려볼 문제는 785번 Is Graph Bipartite? 이라는 문제이다.


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

leetcode 문제 사진

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

으어 이번주 너무 길어


입력


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



풀이 및 코드


입력으로 들어온 그래프가 Bipartite인지 판단하는 문제다.


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

BFS로 level단위를 돌면서 컬러링을 진행하는 식으로 문제를 풀었다.


이제 코드를 봐보자!


풀이코드

class Solution {
    public boolean isBipartite(int[][] graph) {
        var arr = new Boolean[graph.length];
        var visit = new boolean[graph.length];
        var q = new LinkedList<Integer>();
        
        for(int i = 0; i < graph.length; i++) {
            if(arr[i] != null) continue;
            q.add(i);
            arr[i] = true;
            
            while(!q.isEmpty()) {
                var now = q.poll();

                if(visit[now]) continue;

                visit[now] = true;

                for(var child: graph[now]) {
                    if(arr[child] == null) arr[child] = !arr[now];
                    else if(arr[child] == arr[now]) return false;

                    q.add(child);
                }
            }
        }
        
        return true;
    }
}




제출 화면

leetcode 문제 맞았습니다


요즘 자꾸 블로그 쓰는걸 까먹어서 오랜만에 올려본다!


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

2023년 04월 28일 금요일 - 4월이 가기 전에 한 번 올립니다~


오늘 올려볼 문제는 839번 Similar String Groups 이라는 문제이다.


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

leetcode 문제 사진

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

오늘 대체 문제가 더 어려웠다....


입력


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



풀이 및 코드


string 2개를 비교했을 때 인덱스 2개에 해당하는 원소를 교체했을 때 같거나 처음부터 같다면 같은 집합에 포함한다고 했을 때 집합의 개수를 구하는 문제이다.


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

dfs로 직접 비교해가면서 문제를 풀었다.

또한 시간을 줄이기 위해서 set을 사용했다.


이제 코드를 봐보자!


풀이코드

class Solution {
    HashSet<String> set = new HashSet<>();
    String[] strs;
    public int numSimilarGroups(String[] strs) {
        this.strs = strs;
        int result = 0;
        
        for(var str: strs) {
            if(set.contains(str)) continue;
            solve(str);
            result++;
        }
        
        return result;
    }
    
    private void solve(String str1) {
        set.add(str1);
        var arr1 = str1.toCharArray();
        
        for(var str2: strs) {
            if(set.contains(str2)) continue;
            
            var arr2 = str2.toCharArray();
            
            int diff = 0;
            for(int i = 0; i < arr1.length && diff <= 2; i++)
                if(arr1[i] != arr2[i]) diff++;

            
            if(diff == 2) solve(str2);
        }
    }
}




제출 화면

leetcode 문제 맞았습니다


오랜만에 블로그를 쓰는데 뭔가 느낌이 묘하다 ㅋㅋㅋ


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

2023년 04월 18일 화요일 - 스터디원++


오늘 올려볼 문제는 1768번 Merge Strings Alternately 이라는 문제이다.


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

leetcode 문제 사진

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

1분컷


입력


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



풀이 및 코드


String 2개를 원소 하나하나씩 교차하면서 합치고 리턴하는 문제이다.


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

그냥 코드로 보면 될 듯.


이제 코드를 봐보자!


풀이코드

class Solution {
    public String mergeAlternately(String word1, String word2) {
        int i1 = 0, i2 = 0;
        var sb = new StringBuilder();
        
        while(i1 < word1.length() && i2 < word2.length()) {
            sb.append(word1.charAt(i1++));
            sb.append(word2.charAt(i2++));
        }
        
        while(i1 < word1.length()) sb.append(word1.charAt(i1++));
        while(i2 < word2.length()) sb.append(word2.charAt(i2++));
        
        return sb.toString();
    }
}




제출 화면

leetcode 문제 맞았습니다


스터디원이 늘었다!!

더 열심히 해보자!!


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

+ Recent posts