본문 바로가기

알고리즘/LeetCode

(8)
[LeetCode] 400. Nth Digit(Java, 순서 찾기, N번째 숫자 찾기, 코딩테스트) ## 접근방법 이 문제는, 1부터 2^31 - 1까지 나열했을 때, N번째 숫자를 찾는 것이다. 10번째 숫자는, 10에서 1을 의미한다. 이제 규칙을 찾아서, N번째 숫자를 찾아야 한다. N의 범위가 2^31 - 1이므로, 모든 숫자를 확인하면서 자리수를 확인하면 시간초과가 발생할 것이다. 자리수의 규칙을 찾아보자. 1 ~ 9는 한 자리수, 9개 10 ~ 99는 두 자리수, 90 * 2개 100 ~ 999는 세 자리수, 900 * 3개 위와 같은 규칙이 성립한다. 위의 규칙을 이용하면 N이 적어도 몇 자리수인지 파악이 가능하다. 개수를 누적합하면서, 구간을 찾으면 몇자리수인지 확인할 수 있다. 위의 그림을 보면서 규칙을 파악해보자. 현재 두 자리수는 10번째부터 시작한다. 몇번째부터 시작하는지는 N -..
[LeetCode] 60. Permutation Sequence(Java, Hard) ## 접근방법 순열 문제는 자주 나온다. 보통은 그 다음 순열을 물어보는데, 이 문제는 전체 순열에서 순서를 물어보고 있다는 차이점이 있다. 순열을 생각해보면, 1234에서 가장 앞자리가 2가 되려면 3!만큼의 순서가 지나야 될 수 있다. 즉, 어떤 순서를 구할 때, 바로 다음을 구하는 것보다 팩토리얼을 이용해서, 순서를 차감해가는 방식을 사용할 것이다. 그림과 함께 이해를 해보도록 하자. n은 6이고 k는 77이라고 가정해보자, 어떤 수를 넣어도 원리는 동일하다. 첫번째 그림은 초기 상태인 123456을 의미한다. 두번째 그림은, 77 - 5! >= 1이다. 따라서, 1에서 가장 가깝게 큰 2로 변경해준다. 세번째 그림은, 17 - 3! >= 1이므로, 3에서 가장 가깝게 큰 4로 변경해준다. 네번째 ..
[LeetCode] 754. Reach a Number leetcode.com/problems/reach-a-number/ Reach a Number - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 이 문제를 전체 탐색을 한다고 생각하면, 2의 지수승이 되므로 전체 탐색은 무조건 TLE를 받는다고 생각하면 된다. 처음 순간에 +1, -1 이후에 +2, -2를 선택하는 과정을 쭉 생각해보면, 탐색해야 하는 노드의 수는 2 * 2 * 2 * 2...가 될 것이다. target만큼 접근하기 위해서, 어떻게..
[LeetCode] 139. Word Break (Java) leetcode.com/problems/word-break/ Word Break - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 어떤 문자열이, 단어들의 조합으로 만들어졌는지 확인하는 문제다. 문자열을 재귀적으로 함수를 단순하게 호출한다면, 시간초과가 발생한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 class Solution { HashSet hs = new HashSet(); pu..
[LeetCode] 77. Combinations (Java, 조합) leetcode.com/problems/combinations/ Combinations - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 이 문제는 흔히 나오는 조합 문제이다. 지금까지 코드를 작성할 때, 단순히 재귀함수로 코드를 작성하도록 구현했었다. 시간이 20ms가 나와서, 다른 코드들을 참고해봤다. 다른 코드들을 보니, 지금가진 개수와 남은 개수들을 모두 써도 원하는 조합의 길이를 만들지 못한다면 탐색할 필요가 없다는 사실을 이용했다. 이 ..
[LeetCode] 43. Multiply Strings(Java, Multiply) leetcode.com/problems/multiply-strings/ Multiply Strings - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 대부분의 수학문제들은 수학적 풀이 사고가 있다면 쉽게 해결할 수 있다. 곱셈을 배웠을 때를 기억해보자. 여러 자리 수의 곱셈을 할 때, 위에 길이가 긴 수를 두고 아래에 길이가 짧은 수를 두고 연산을 시작한다. 아래의 길이가 짧은 수를, 위의 수와 자릿수에 맞게끔 곱셈을 하고, 모든 과정에서 나온 ..
[leetcode] 199. Binary Tree Right Side View(Java, BFS) leetcode.com/problems/binary-tree-right-side-view/ Binary Tree Right Side View - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 처음에 문제를 해석하다가, Right Side라고 해서 트리노드의 오른쪽 노드들을 출력하는줄 알았다 ㅠ... 하지만 그게 아니라, 트리를 오른쪽에서 바라봤을때 보이는 노드들을 출력하는 것이다. 즉, 같은 레벨에서 가장 오른쪽에 있는 노드들을 출력하면 된다. 우..
[leetcode] 33. Search in Rotated Sorted Array(Java, LogN, Binary Search) leetcode.com/problems/search-in-rotated-sorted-array/ Search in Rotated Sorted Array - LeetCode Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview. leetcode.com ## 접근방법 이 문제는 시간 복잡도가 logN이 되도록 문제를 풀어야 한다, 단순 선형 탐색으로 문제를 풀어도 정답은 되지만, 출제의도가 아니다. 우선 피벗을 기준으로, 정렬된 배열들이 섞이게 된다. 중요한 점은, 피벗을 기준으로 각자 정렬을 유지하고 있다는 것..