https://school.programmers.co.kr/learn/courses/30/lessons/138476 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 진짜 엄청 당황스럽게도... 나는 getOrDefault를 거의 사용해본 적이 없어서 이건 찾아가면서 했다. (처음에는 hashset을 사용했다가 아 이건 좀... 하면서 뇌가 터져서 검색했음) 문제 풀이 자체는 단순하다 1. 제일 많은 것부터 차례로 k에서 뺀다 2. k가 음수가 되는 순간까지 카운트하여 카운트를 리턴한다. 다양한 방법이 있지만... (arraylist를 사용할 경우 for문이..
재귀 사용했다가 타임오버가 나와서 dp를 사용하기로 했다 피보나치 수열 문제인데, 피보나치 수열은 바로 전과 전전 것의 합이 다음 것이 되는 것인데, 차례로 계산해서 목표 값까지 올라가는 방식으로 하면 된다. 이와 같이 순차적 증감식이나 최소, 최대 부분을 구할 때에 (같은 방식과 이전 값을 재활용하여 다음 식에서 사용하는) 방식을 사용할 때 dp구조를 사용하면 쉽게 답을 찾을 수 있다. class Solution { public long solution(int n) { long answer = 0; long[] dp = new long[2001]; dp[1] = 1; dp[2] = 2; for(int i = 3; i
문제에서의 규칙은 1. 언제나 승리한다 2. 1, 2 -> 1 / 2, 3 -> 2 와 같이 한단계씩 증가한다 3. 두 수가 만날 때 멈춘다 정해진 끝이 없는 상태이기 때문에 while으로 맞추고, 다음으로는 해당하는 공식을 생각한다. 다음 문제의 경우 두 수의 다음 수고, 언제나 짝수이기 때문에 짝수에 해당하는 큰 수를 기준으로 나누고, 홀수의 경우 언제나 짝수 - 1이기때문에 나눈 수 + 1을 하면 된다. 다른 풀이로는 %를 해 나머지를 구하는 방법이 존재한다. 나는 후자를 선택함. 두 수가 나올 때까지 ans에 ++를 해서 올라가는 증감식을 선택하고, 두 수가 같을 때 증감을 마무리하고 해당하는 값을 리턴하면 끝! public int t04(int n, int a, int b) { int answe..
최소공배수와 최대공약수는 계속해서 나오는 거라 그냥 외워버렸다 (...) 최대공약수를 구하는 것은 결국 계속해서 약분하여 제일 작은 수가 나올 때까지 반복하는 것이기 때문에 public static int gcd(int a, int b){ if (a % b == 0){ return b; } return gcd(b, a % b); } 와 같은 형태로 구한다. a랑 b를 나누고 이것의 나머지가 0이 되면 바로 b를 리턴해버리고, 그게 아니라면 다시 b와, a를 b와 나눈 나머지를 리턴하는 형태 최소공배수는 최대공약수 * a * b의 형태이기 때문에 public static int lcm(int a, int b){ return a * b / gcd(a, b); } 의 형태로 나타내면 된다. public int..
문제풀이 1. sort를 이용하여 우선 오름차순 정렬을 만든 다음 2. 무거운 사람부터 제거해나가는 것이 리밋에 걸리기 쉬우니까 아래로 내려가면서 체크한다 3. 제일 무거운 사람과 제일 가벼운 사람의 합이 limit보다 적거나 같을 경우에 min을 더해주면서 다음 순차로 가도록 한다 그렇다면 min++를 통해 다음 연산에는 min + 1이 적용되어 이전 차례는 넘기고 다음 것과 연산을 한다. public int t02(int[] people, int limit) { int answer = 0; Arrays.sort(people); int min = 0; for(int max = people.length - 1; min
이 문제는 크게 어렵지 않은 문제다. 현재까지 온 거리 x 2를 계속해서 움직이는 제일 좋은 경우의 수를 가지고 오는 것이기 때문에 주어진 수 n에서 2를 나누고, 거기에서 홀수일 경우 한칸 이동하는 것을 생각하여 1을 카운트하고, 그렇지 않을 경우 다시 나누는 경우로 계속해서 0이 될 때까지 반복한다. import java.util.*; public class Solution { public int solution(int n) { int ans = 0; while (n > 0){ if (n % 2 == 0){ n /= 2; } else { n -= 1; ans++; } } return ans; } }
문제 설명 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다. - 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. - 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. - 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. - 이전에 등장했던 단어는 사용할 수 없습니다. - 한 글자인 단어는 인정되지 않습니다. - 다음은 3명이 끝말잇기를 하는 상황을 나타냅니다. tank → kick → know → wheel → land → dream → mother → robot → tank 위 끝말잇기는 다음과 같이 진행됩니다. - 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다. - 2번 사..
문제 설명 1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다. - 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다. - 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다. - 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다. - 이전에 등장했던 단어는 사용할 수 없습니다. - 한 글자인 단어는 인정되지 않습니다. - 다음은 3명이 끝말잇기를 하는 상황을 나타냅니다. tank → kick → know → wheel → land → dream → mother → robot → tank 위 끝말잇기는 다음과 같이 진행됩니다. - 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다. - 2번 사..
문제 설명 자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다. 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다. 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다. 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다. 예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다. 자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요. 제한 사항 n은 1,000,000 이하의 자연수 입니다. 이건 제법 쉽게 해결했다 :D 우선, 받은 수 n을 이진수로 변환하여 1의 갯수를 먼저 구한다. n을 이진수로 변환하면서 동시에 String으로 저..