-
얏호! 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과 5를 출력해야 한다면, 각각 int형이므로 1 + 5는 6으로 출력될 것이다.
- 내가 원하는 것은 15이므로 각각을 String으로 만든 후 합쳐서 출력하자.
- 응 출력 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
'Algorithm' 카테고리의 다른 글
와! 백준 실버 찍었다! (0) 2023.04.03 useDelimiter(), StringTokenizer(), split() 사용법과 차이점 (0) 2023.03.20 useDelimiter StringTokenizer 차이점 (0) 2023.03.20