알고리즘 공부

카테고리: 정렬 레벨: 2 언어: Java 문제 처음에 문제를 읽었을 때 뭔가 쉬워 보이면서도 이해가 안 가는 문제였다. 그래도 친절하게 위키백과에서 H-Index에 관한 개념을 확인할 수 있어서 읽어보니 바로 이해할 수 있었다. h-index - Wikipedia From Wikipedia, the free encyclopedia Metric that attempts to measure the productivity and citation impact of a person's publications The h-index is an author-level metric that measures both the productivity and citation impact of the publications, ..
카테고리: 그리디 레벨: 1 언어: Java 문제 처음에 문제를 이해하는데 어려움은 없었다. 만약에 2번 학생이 체육복이 없다면 3번이나 1번 학생이 체육복을 빌려주면 되고, 체육복이 없는 사람을 기준으로 -1이나 +1을 해줘서 풀면 된다고 생각했다. 하지만 막상 풀어보니 코드를 실행했을 때는 테스트 케이스가 맞았지만, 제출을 해보니 중간에 실패가 몇 개 발생하였다. 어떤 것이 문제인지 살펴보니 체육복을 도난당한 학생들과 여벌의 체육복이 있는 학생들을 정렬시켜 줘야지 번호가 섞여도 문제가 되지 않았고, 여벌의 체육복을 가져온 학생도 도난당할 수 있다는 제한 사항도 있어서 처리가 필요했었다. 입출력 예시 풀이 public int solution(int n, int[] lost, int[] reserve) ..
카테고리: 정렬 레벨: 2 언어: Java 문제 입출력 예시 풀이 public String solution(int[] numbers) { String[] str = new String[numbers.length]; StringBuilder sb = new StringBuilder(); for (int i = 0; i (o2 + o1).compareTo(o1 + o2))); if (str[0].equals("0")) { return "0"; } for (int i = 0; i < str.length; i++) { sb.append(str[i]); ..
프로그래머스 - 주식가격 카테고리: 스택/큐 레벨: 2 언어: Java 문제 입출력 예시 풀이 간단히 머리로 그림을 그려보면 이해하기 쉬운 문제였다. (풀기는 난감했지만...) 그림을 그려보며 이해해 보자. 먼저 1초일 때 생각을 해보면 1초일때 주식 가격은 1이다. 이 가격은 주어진 5초가 지날 때까지 1 이하로 떨어지지 않는다. 여기서 문제의 핵심을 알 수 있는데 현재 시간에서의 주식 가격이 남은 시간 동안 얼마나 떨어지지 않고 유지되는지 알아보는 문제이다. 2초일 때를 생각해 보면 주식의 가격은 2이고 5초가 될 때까지 주식 가격은 2 이하로 떨어지지 않는다. 3초일 때를 생각해 보면 주식의 가격은 3이고 4초가 될 때 주식의 가격이 2로 떨어지고 그다음 시간에 3초로 가격이 상승한다. 5초가 될 ..
프로그래머스 - 다리를 지나는 트럭 카테고리: 스택/큐 레벨: 2 언어: Java 문제 입출력 예시 풀이 이번 문제도 이해하는데 어렵지 않다. 그림으로 먼저 이해를 해보자. 예제 1번을 생각하면서 그림을 그려보면 위의 그림과 같이 트럭들이 대기하고 있는 상태이다. 다리는 총 10의 무게를 견딜 수가 있으므로 각 트럭의 무게를 고려하며 지나가야 된다. 여기서 다리의 길이는 2이다. 즉, 트럭이 다리를 지나갈 때 최대 2대만 지나갈 수 있다. 먼저 무게가 7인 트럭이 다리를 건너고 있다면 다리가 견딜 수 있는 무게를 생각해 나머지 트럭들이 대기한다. 무게가 7인 트럭이 지나가고 나서 대기하고 있던 무게가 4인 트럭이 다리를 지나가게 된다. 다리가 견딜 수 있는 무게는 총 10이므로 무게가 4인 트럭과 5인 ..
하노이 탑 재귀 알고리즘의 대표적인 문제로 하노이 탑 문제가 있다. 문제를 설명해 보자면 1번 기둥에 있는 원반들을 3번 기둥으로 옮겨야 되는데 여기서 조건이 하나 있다. 길이가 짧은 원반 위에 길이가 긴 원반을 둘 수 없다는 조건이 있는데 해당 조건을 고려하며 문제를 풀어보자. public void hanoiTest(int from, int mid, int to, int value) { if (value >= 1) { hanoiTest(from, to, mid, value - 1); System.out.printf("%d번 원반을 %d번에서 %d번으로 옮겼다.\n", value, from, to); hanoiTest(mid, from, to, value - 1); } } 코드는 재귀를 통해서 구현하게 ..
프로그래머스 - 프로세스 카테고리: 스택/큐 레벨: 2 언어: Java 문제 입출력 예시 풀이 프로세스 문제를 이해하는 데는 오래 걸리지 않았다. 하지만 어떻게 풀어야 되는지 잘 모르는 문제였다. 우선순위에 따라서 주어진 프로세스의 위치를 알려줄 때 몇 번째로 실행되는지 구하는 문제여서 Queue 자료구조를 통해서 풀어야 한다는 것은 알았지만, 우선순위 큐가 있다는 것은 모르고 있었다. 먼저 우선순위 큐를 활용하여 푼 코드를 살펴보면 public int solution(int[] priorities, int location) { int answer = 0; PriorityQueue priorityQueue = new PriorityQueue(Collections.reverseOrder()); for (i..
프로그래머스 - 올바른 괄호 카테고리: 스택/큐 레벨: 2 언어: Java 문제 입출력 예시 풀이 괄호 문제는 대표적인 스택 문제이다. 먼저 코드를 살펴보면 아래와 같다. boolean solution(String s) { Stack stack = new Stack(); char[] charArray = s.toCharArray(); for (int i = 0; i < charArray.length; i++) { if (charArray[i] == '(') { stack.push('('); } else if (charArray[i] == ')') { if (stack.isEmpty()) return false; stack.pop(); } } return stack.isEmpty(); } 먼저 매개변수로 ..
프로그래머스 - 기능개발 카테고리: 스택/큐 레벨: 2 언어: Java 문제 이해하기 입출력 예시 [93, 30, 55]를 가지고 문제를 이해해 보자. 먼저 그림을 그려보면서 이해를 해보면 1칸에 하루가 걸린다고 가정을 해보자. 기능 A를 완료하는 데 걸리는 기간은 7일, 기능 B는 3일, 기능 C는 9일이 걸린다. 하지만 문제에서 나왔던 것처럼 기능 B가 A보다 빨리 끝났다 하더라도 기능 A가 완료되기 전까지 기능 B는 배포가 불가능하다. 7일이 돼서 기능 A가 완료되었다고 하면 먼저 끝난 기능 B와 같이 배포하게 된다. 나머지 기능 C는 9일이나 걸리기 때문에 해당 기능이 완료되면 알아서 배포하게 된다. 문제의 핵심은 어떠한 작업이 있을 경우 그 앞의 기능보다 빨리 끝나냐, 아니냐가 중요하다. 문제 ..
프로그래머스 - 같은 숫자는 싫어 카테고리: 스택/큐 레벨: 1 문제 풀이 언어: Java 문제 입/출력 예시 문제 풀이 public int[] solution(int []arr) { int[] answer; Stack stack = new Stack(); // Integer 스택 생성 for (int i = 0; i < arr.length; i++) { // 입력값만큼 반복문을 돈다. if (i == 0) stack.push(arr[i]); // 스택에 데이터 삽입 else if (stack.peek() != arr[i]) stack.push(arr[i]); // 최근에 삽입한 데이터가 현재 데이터와 다를 경우 삽입 } answer = new int[stack.size()]; // 최종 스택의 사이즈만..
문제 단계별로 풀어보기 - 심화 1 문제 문제를 이해하는 데 어렵지는 않았다. 그냥 학점과 과목평점을 곱하고 학점 총합으로 나눠주면 되는 간단한 문제였다. 풀이 오래 걸리지 않고 풀었는데 다른 사람들의 풀이를 보니 내가 많이 부족하다는 것을 느꼈다. 먼저 내가 작성한 풀이부터 보자면 아래 코드와 같다. package Sliver.Silver5; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Silver5_25206_심화1 { public static void main(String[] args) throw..
백준 2346번 문제는 Deque 자료구조를 이용한 문제이다. 문제 문제는 직접 그림을 그려 보면서 풀어보면 어려운 문제는 아니다. 입력 & 출력 풀이 먼저 정수 N을 선언하여 명령어의 개수를 받아준다. Deque를 선언하고 현재 받아온 종이의 값에 순서를 정해준다. 위의 문제를 읽어보면 알 수 있지만 시작하면 무조건 첫 번째 풍선을 터트리끼 때문에 현재 K 배열의 0번째 값을 따로 받아주고 결과 값에는 1을 넣어준다. 그 다음 for문을 통해서 종이에 적힌 값 들을 순서에 맞게 add 해준다. 먼저 첫 번째 풍선을 터트렸을 때 종이에 적힌 값은 3이므로 3번 이동한 위치의 풍선을 터트려야 된다. 따라서 3번 이동하기 까지 deque의 값을 poll해서 다시 add해준다. 3번 이동한 값의 데이터를 po..
백준 18870번 문제는 정렬에 관한 문제이다. 문제 문제를 이해하는데 상당한 시간이 걸렸다. 결국 문제를 이해하지 못했고 구글에 검색해서 찾아보고 난 후 이해하게 되었다. 문제는 결국 Xi의 좌표 보다 작은 Xj 좌표가 몇개가 있는지 물어보는 문제였다. 밑에 예제를 보면서 생각해보면 첫 번째 좌표 Xi로 2가 주어진다면 다른 좌표에서 Xi보다 작은 좌표를 찾게 되고 해당 좌표보다 작은 값으로 -10과 -9가 있다는 것을 알 수 있다. 따라서 Xi가 2인 좌표를 압축하면 2가 나오게 되는 것이다. 입력 & 출력 풀이 먼저 정수 N을 선언하여 명령어를 받아주고 좌표를 받아 줄 M, K 배열을 만들어준다. HashMap을 사용하여 처리를 하기 위해서 HashMap을 선언해준다. 명령어의 숫자만큼 K와 M 배..
백준 11866번 문제는 Queue 자료 구조를 이용하여 해결하는 문제이다. 처음에 문제를 이해하는데 어려울 수 있는데 쉽게 생각해보면 원 모양의 탁자에 순서대로 1번 부터 사람이 앉아 있다고 생각해보자. 아래의 예제에서 나온 것과 같이 7명의 사람이 앉아 있는데 3번째 마다 해당하는 사람을 제거 해야한다. 처음에 1번 부터 시작한다면 3번째 순서인 3번 사람이 제거될 것이고 그 다음 6번 사람이 제거된다. 여기서 중요한 것은 3번째 사람을 제거하는 방식은 한 번 제거된 사람은 제외하고 남은 사람들에게만 적용한다는 것을 알고 있으면 풀기 수월한 문제이다. 문제 입력 & 출력 풀이 먼저 Queue 자료구조를 활용해야 되기 때문에 해당 자료구조를 선언해준다. 총 참가하는 사람을 N명으로 생각하고 몇번 째마다..
백준 18258번 문제는 Queue 자료 구조를 이해하고 있는지 확인하는 문제이다. 해당 문제는 큐를 물어보는 문제와 비슷하기 때문에 여기서는 Deque를 이용해서 풀이했다. 문제 입력 & 출력 풀이 먼저 앞서 스택이나 큐 자료 구조를 이용한 문제와 비슷하게 데이터를 받아준다. 정수 N을 선언해서 명령어의 개수를 받아주는 것도 동일하다. 이 문제에서는 다른 스택이나 큐 문제와는 다르게 front와 back 명령어를 수행해야 한다. front 명령어는 자료 구조에서 맨 앞에 위치한 데이터를 묻는 명령어고, back은 맨 뒤에 위치한 데이터를 묻는 명령어이다. Deque를 사용하면 자료 구조 양 쪽 끝에서 삽입 삭제가 이뤄지기 때문에 해당 자료 구조를 활용하면 쉽게 풀 수 있다. 먼저 peek()를 사용하여..
Hosae905
'알고리즘 공부' 카테고리의 글 목록