ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 얏호! LeedCode Contest 첫 참여 후기!
    Algorithm 2023. 4. 2. 01:07

    하루입니다.
     


     
    오늘은 새로 알게 된 알고리즘(?) 사이트인 LeetCode의 Contest에 참여했다. 릿코드는 실제 기업에서 나온 문제들을 사용해서  문제 퀄리티가 좋다는 추천이 있었기에 알게 된 사이트이다. 문제가 영어라는 게 문제지만, 해외 기업에 취업하고 싶은 사람에게는 영어로 코테를 대비할 수 있는 기회가 되지 않을까? 라는 생각을 했다.
     
     

    규칙

    • 두 배열 중 가장 작은 공통된 수를 찾는다.
    • 만약 가장 작은 '공통된'수가 없다면 각 배열의 가장 작은 수를 나열한다.
    • 이 때, 5와 1이 있다면 15 이런 식으로 최소로 만들어야 한다. (아마도)
    • 배열의 크기는 1부터 9까지, 숫자도 1부터 9까지이다.
    • 모든 숫자는 유니크하다.
    nums1 = [4,1,3], nums2 = [5,7]
    output = 15
    
    Input: nums1 = [3,5,2,6], nums2 = [3,1,7]
    Output: 3
    
    1 <= nums1.length, nums2.length <= 9
    1 <= nums1[i], nums2[i] <= 9
    All digits in each array are unique.

     
     


     
     

    0차 도전

    호기롭게 도전!
    했다가 잠시 미루기.
     
    왜냐면 출력이 int 형이어야 하는데 String으로 출력하려 했기 때문이다.
     
    내 사고방식

    1. 만약 공통 최소값이 없어서 1과 5를 출력해야 한다면, 각각 int형이므로 1 + 5는 6으로 출력될 것이다.
    2. 내가 원하는 것은 15이므로 각각을 String으로 만든 후 합쳐서 출력하자.
    3. 응 출력 int야 돌아가
    return (min1 < min2 ? (String.valueOf(min1) + String.valueOf(min2)) : (String.valueOf(min2) + String.valueOf(min1)));

     
     
    해결
    더 작은 수*10 + 더 큰 수
    참고로 이건 내가 젤 좋아하는 풀이 방법이기도 하당 나머지와 몫을 사용하는 거
     
     
     


     
     

    1차 도전

    이번에야말로! 했다가 실패.
     
     
    실패 이유

    • 문제 이해를 잘못 했다.
    • 배열간에 복수의 수가 겹칠 수 있다. 
    • 예를 들어 3, 1, 5가 배열간 동일한 수라면, 나는 이 중 1을 출력해야 한다. 

     
    당시의 코드는 아래와 같다.
     

    더보기

    시도 1

    import java.util.*;

    class Solution {
        public int minNumber(int[] nums1, int[] nums2) {
            int min1 = 10;
            int min2 = 10;
            
            for(int i = 0; i < nums1.length; i++) {
                if(nums1[i] < min1)
                    min1 = nums1[i];
            }
            
            for(int i = 0; i < nums2.length; i++) {
                if(nums2[i] < min2)
                    min2 = nums2[i];
            }
            
            if(min1 == min2){
                return min1;
            } else {
                return min1 < min2 ? (min1*10 + min2) : (min2*10 + min1);
            }
        }
    }

     
     


     
     

    2차 도전

    이번엔 진짜 맞았다 두 경우 다 대비했다 ;;
     
    응 돌아가
     
    왜 저를 돌려 보내시나요
     
    이유

    • 도저히 모르겠어서 디버깅 돌림
    • 만약 두 배열의 숫자가 일치하는 경우, same(공동최저수)에 들어가고 싶다면 same보다 작은 숫자여야 한다. 하지만 냅다 먼저 same에 넣어버리니까 더 작은 수가 아닌 그냥 일치만 해도 들어가게 되고, 결국 맨 마지막으로 일치하는 숫자가 same이 되었다.

     

    더보기

    시도 2

    import java.util.*;

    class Solution {
        public int minNumber(int[] nums1, int[] nums2) {
            int min1 = 10;
            int min2 = 10;
            int same = 0;
            
            for(int i = 0; i < nums1.length; i++) {
                if(nums1[i] < min1)
                    min1 = nums1[i];
            }
            
            for(int i = 0; i < nums2.length; i++) {
                if(nums2[i] < min2)
                    min2 = nums2[i];
            }
            
            for(int i = 0; i < nums1.length; i++) {
                for(int j = 0; j < nums2.length; j++) {
                    if(nums1[i] == nums2[j]) {

                        // 여기가 문제!
                        same = nums2[j];
                           if(nums2[j] < same) {
                               same = nums2[j];
                        }
                    }
                }
            }
            
            
            if(same != 0){
                return same;
            } else {
                return min1 < min2 ? (min1*10 + min2) : (min2*10 + min1);
            }
        }
    }

     
     


     
     

    시도 3

    성공!

    import java.util.*;
    
    class Solution {
        public int minNumber(int[] nums1, int[] nums2) {
            int min1 = 10;
            int min2 = 10;
            int same = 10;
            
            for(int i = 0; i < nums1.length; i++) {
                if(nums1[i] < min1)
                    min1 = nums1[i];
            }
            
            for(int i = 0; i < nums2.length; i++) {
                if(nums2[i] < min2)
                    min2 = nums2[i];
            }
            
            for(int i = 0; i < nums1.length; i++) {
                for(int j = 0; j < nums2.length; j++) {
                    if(nums1[i] == nums2[j]) {
                        if(nums2[j] < same) {
                            same = nums2[j];
                        }
                    }
                }
            }
            
            if(same != 10){
                return same;
            } else {
                return min1 < min2 ? (min1*10 + min2) : (min2*10 + min1);
            }
        }
    }

     


     
    이런 거 첨 해봤는데 재밌었다! 총 4문제 있던 걸로 아는데 참여에 의미를 두고 맨 처음 문제만 풀었음 ㅎㅎ. 역시나 문제 이해를 잘 해야 코드도 잘 짤 수 있다는 걸 다시 한 번 깨달았다. 꽤나 잼나용.
     
    https://github.com/mjkim856/Algorithm/blob/main/LeetCode/Easy/2605.%20Form%20Smallest%20Number%20From%20Two%20Digit%20Arrays
     
     

Designed by Tistory.