본문 바로가기

전체 글

(201)
[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로 변경해준다. 네번째 ..
2차원 배열 회전시키기(Rotate, Rotate Image, Java) 2차원 배열을 회전시켜야 하는 경우가 종종 발생한다. 일반적으로는 추가 배열을 선언해서, 90도 돌린 상태를 얻을 것이다. 배열이 n x n이라고 했을 때, (i, j)는 (j, n - 1 - i)로 변환된다. ## 추가배열 로테이트 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public void commonRotate(int[][] matrix){ int n = matrix.length; int[][] nMatrix = new int[n][n]; for(int i = 0; i
[프로그래머스] 다리를 지나는 트럭(Java, Lv2, 큐) programmers.co.kr/learn/courses/30/lessons/42583?language=java 코딩테스트 연습 - 다리를 지나는 트럭 트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이 programmers.co.kr ## 접근방법 모든 트럭이 다리를 지나는 시간을 구하면 된다. 트럭마다 무게가 다르고, 다리가 견딜 수 있는 하중 무게도 생각해야 한다. 큐를 이용하면, 트럭들의 무게와 다리를 지나는 시간을 저장할 수 있다 .큐를 사용하는 이유는, 큐의 후입선출 방식때문이다. 즉, 나중에 들어온 트럭들은 순차적으로 큐에 쌓이고, 큐의 포인터가 가리키는..
[프로그래머스] 섬 연결하기(Java, Greedy, Lv3) programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr ## 접근방법 섬을 최소의 비용으로 연결해야 한다. 이 문제를 보자마자 최소 신장트리의 개념이 떠올랐다. 가장 거리가 짧은 것들 부터 추가하면, 최소의 비용으로 모든 섬들을 연결할 수 있다. 그리디에서 자주 출제되는 유형은, 가장 거리가 짧은 것부터 찾아서 전역적 최적해를 찾는 방식이 자주 나오는 거 같다. 본론으로 돌아가서, 크루스칼 알고리즘을 이용하면 쉽게 문제를 해결할 수 있다. 처음에 시행착오를 소개하자면, 다리 비용을 기준으로 오름차순으로 정렬을 마쳤지만, 섬을 방..
[프로그래머스] 큰 수 만들기(Java, Greedy, Lv2, 새로운 코드, 사고력) programmers.co.kr/learn/courses/30/lessons/42883# 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr ## 접근방법 주어진 문자열에서, K개만큼을 지워서 가장 큰 수를 만들어야 한다. 앞자리가 클수록 가장 큰 수에 가까워질 것이다. 그렇다면, 어떻게 앞자리를 크게 만들까? 앞에서 탐색하면서, 해당 수보다 큰 수가 존재한다면 그 수로 교체할 수 있다. 그 수로 교체하기 위해선 사이에 있는 수들은 모두 지워야 한다. 만약에 사이에 있는 수들을 모두 지웠는데 정답의 길이가 되지 않는다면, 찾은 큰 수를 선택할 수 없다. 매순간에 앞자리를 크게 만드는 것이 가장 큰 수를 만들 수 있는 방법이다. 어떤 수보다 큰 수의 후보들은 (해당 수 + 1 ~ 9)가 될 ..
[프로그래머스] 조이스틱(Lv2, Greedy, 사고력, Java) programmers.co.kr/learn/courses/30/lessons/42860 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr ## 접근방법 조이스틱을 이용해서, 최소의 조이스틱 조작 횟수로 원하는 문자열을 만들어야 한다. 우선, 특정 위치에서 A에서부터 특정 문자를 만드는 것은, 위 혹은 아래로 이동하면 만들 수 있다. 위 방향으로만 이동하거나 아래 방향으로만 이동해야 최소로 문자를 만들 수 있다. 두 방향중에 작은 이동횟수를 선택해서 만들어주면 된다. 핵심은, 어떤 순서로 문자..
[프로그래머스] 체육복(Greedy, Java, Lv1, 사고력) programmers.co.kr/learn/courses/30/lessons/42862# 코딩테스트 연습 - 체육복 점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번 programmers.co.kr ## 문제접근 체육복을 최대한 많은 학생들에게 나눠주려고 한다. 어떻게 나눠줘야 할까? 여벌이 있는 체육복들을 탐색하면서, 앞이나 뒤 혹은 자신이 체육복을 잃어버린 목록에 포함된다면 제공하면 된다. 하지만, 앞이나 뒤 혹은 자신을 매번 선택해야 하는데, 어떻게 선택하는것이 가장 현명할까? 체육복 여벌이 있는 사람이 번호 순서대로 체육복을 임의로 나눠준다고 생각해보자. 낮은 번..