본문 바로가기

분류 전체보기

동적 계획법, 동적 프로그래밍 재귀와 같이,, 자기 자신을 계속 호출하는 형태의 함수에서 각 함수의 결과를 미리 저장해 놓고, 호출시 저장된 값을 활용해 시간을 단축하는 방법 가령 피보나치 수열을 예로 위 그림과 같이 계속 반복되는 부분이 있을 때,, 초기 매개변수가 작다면 실행 시간에 큰 차이가 없지만,,매개변수가 커졌을 때, 매번 그 부분을 계산하는 것은 매우 비효율적이다. 따라서 그 값을 저장해둔다. 아래는 비교 - 동적 계획법 X/** * 일반 재귀 * @param n * @return */ public static int fibo(int n) { if (n == 0) { return 0; } else if (n == 1) { return 1; } else { return fibo(n - 2) + fibo(n -1); } } ..
프로그래머스 - 체육복 내 코드 - 오답 탐욕 알고리즘이라는 게 있다고 하는데,문제의 성격이 일치해야 적용할 수 있는데다가, 좀 직관적인 거라 알고리즘이라는 느낌이 잘 안든다.뭔 말인지 잘 모르겠다. 아래 코드 오답 이유는,한 학생이 여분을 가지고 있고 + 도둑도 맞을 수 있다는 점을 빼먹어서이다. 테스트코드에 하나 추가해 주었으면 더 좋을 거 같다.class Solution { public int solution(int n, int[] lost, int[] reserve) { int answer = n - lost.length; /** * 탐욕 알고리즘 */ outer: for (int i = 0; i < lost.length; i++) { for (int j = 0; j < reserve.length; j++) { if (..
프로그래머스 - 예산 내 코드 - 다른 사람 코드도 Arrays.sort()를 쓰는 것 빼고는 특별한 건 없었던 것 같다.class Solution { public int solution(int[] d, int budget) { int answer = 0; int tmp; /** * 선택 정렬 - 오름차순 */ for (int i = 0; i d[j]) { tmp = d[i]; d[i] = d[j]; d[j] = tmp; } } } /** * 지원 가능한 부서 수 카운트 */ for (int i = 0; i = d[i]) { budget..
프로그래머스 - 2016년 내 코드class Solution { public String solution(int a, int b) { String answer = ""; String[] dayStr = {"FRI", "SAT", "SUN", "MON", "TUE", "WEN", "THU"}; int[] days = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int totalDays = 0; for (int i = 0; i < a - 1; i++) { totalDays += days[i]; } totalDays += b; int dayStrIdx = (totalDays - 1) % dayStr.length; answer = dayStr[dayStrIdx]; return answer; }..
프로그래머스 - 핸드폰 번호 가리기 내 코드class Solution { public String solution(String phone_number) { String answer = ""; int starLen = phone_number.length() - 4; String suffix = phone_number.substring(phone_number.length() - 4); for (int i = 0; i < starLen; i++) { answer += "*"; } answer += suffix; return answer; } } 다른사람 코드 - 이 문제에서 딱히 더 배울 게 있나 싶었는데,, 있었다. 1. 대입 연산자 + 삼항 연산자2. String + char 가능 ("aaaaa" + 'b' = "aaaab")class So..
프로그래머스 - 최대공약수와 최소공배수 최대공약수 구하는 걸 모르겠어서 그냥 바로 참고했다.너무 길어 보이는데, 다 주석이다. 1. 유클리드 호제법- 최소공배수 = (n * m) / 최대공약수- 최대공약수 두 수의 나머지를 이용해 순환2. 유클리드 호제법 사용 전에,, 두 수를 정렬할 필요 X(정렬 해야할 것 같았다.)class Solution { public int[] solution(int n, int m) { int[] answer = new int[2]; /** * 필요없는 부분 */ // if (n > m) { // tmp = m; // m = n; // n = tmp; // } answer[0] = gcd(n, m); answer[1] = lcm(n, m); return answer; } /** * 최소공배수 = (s * b) / ..
프로그래머스 - 제일 작은 수 제거하기 내 코드 - 최솟값을,, 리스트를 따로 만들어, Collections.min();를 사용해도 될 것 같았는데, 그냥 구했다.class Solution { public int[] solution(int[] arr) { int[] answer = {}; int min = arr[0]; for (int i = 0; i arr[i]) { min = arr[i]; } } if (arr.length - 1 == 0) { answer = new int[]{-1}; } else { answer = new int[arr.length - 1]; int idx = 0; for (int num : arr) { if (num != min) { answer[idx] = nu..
프로그래머스 - 정수 제곱근 판별 내 코드class Solution { public long solution(long n) { long answer = -1; double sqrt = Math.sqrt(n); for (int i = 1; i