일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Bruteforce
- 반효경교수님
- algorithm
- 트리
- SQL
- 멘딕스
- 해시맵
- 재귀
- 그래프
- 스택
- 알고리즘
- 정렬
- 자료구조
- Sort
- 이분탐색
- dfs
- MySQL
- Mendix
- domain model
- Recursion
- git
- 프로그래머스
- microflow
- 완전탐색
- 가중치없는그래프
- lcap
- 자바
- 매개변수 탐색
- 집합
- 백트래킹
- Today
- Total
목록알고리즘 풀이 및 리뷰/프로그래머스 (26)
mondegreen
Vector를 상속받아 구현되어 있는 Stack 대신 Deque로 stack을 구현해서 문제를 풀었다. import java.util.*; class Solution { boolean solution(String s) { char [] str = s.toCharArray(); Deque stk = new ArrayDeque(); for(char i : str){ if(i == '(') stk.push(i); else{ if(!stk.isEmpty() && stk.peek()=='(') stk.pop(); else return false; } } return stk.isEmpty(); } }
문제 분석을 진행하면서 배열을 만들까 고민했었다. 논리값 배열을 만들고 지나간 여부를 true / false로 처리하려고 했는데 생각해보니 이 문제는 좌표가 아니라 선분(길, 양 끝의 좌표 세트)을 확인해야 하는 문제였다. 따라서 배열을 사용하지 않고 두 개의 좌표를 필드로 가지고 있는 클래스를 생성해서 그 클래스를 타입으로 하는 해시 셋으로 처리하고자 했다. 하지만 여기서 간과한 것은 내가 클래스의 필드와 생성자만 만들고 set에서 contains로 같다고 확인할 수 있도록 equals 매서드를 만들지 않았기 때문에 각각의 클래스가 new 생성자로 생성된다면 각기 다른 주소값을 가지게 되어 equals로 판별할 수가 없게된다. 그래서 생각한 것은 Set의 타입을 String으로 설정하는 것이다 Stri..
해시맵까지 잘 구현했는데 정렬하는 부분에서 꼬여버렸다. 아래 return문은 스트림 형식으로 추출해서 정렬하고 배열로 반환하는 방식이다. import java.util.*; class Solution { public int[] solution(int N, int[] stages) { int gamer = stages.length; int [] cnt = new int [N+1]; for(int i : stages){ if(i
언제 배웠는지도 기억이 가물가물한 행렬의 곱셈이 어떤 방식으로 처리되는지 이해가 안되서 찾아보고 푼 문제이다. 구현의 핵심은 아래 주석이 달려있는 부분이다. class Solution { public int[][] solution(int[][] arr1, int[][] arr2) { int [][] answer = new int[arr1.length][arr2[0].length]; for(int i = 0; i < answer.length; i++){ for(int j = 0; j < answer[i].length; j++){ for(int k = 0; k < arr2.length; k++){ // 이 반복문이 중요한데 행렬의 곱셈에서 결과 행렬의 크기는 [첫번째 행렬의 행][두번째 행렬의 열] 이다. ..
처음에 큐를 써가면서 앞에서 뽑고 뒤로 넣어야 하나라는 고민을 했다. 하지만 시간이 더 걸릴 것 같아서 배열을 활용한 방법을 고민했고 모드 연산을 통해 반복문을 돌지 않고도 각 수포자의 답안을 비교할 수 있겠다는 것을 깨달았다. 그 뒤의 구현은 복잡하지 않았다. 다만 list를 어떻게 array로 변환할까 고민했고 두 가지 방식을 사용했다. 리스트에서 배열로 복사하는 방법과 스트림으로 변환해서 배열로 만드는 법. 시간은 전자가 훨씬 빠른 것 같다. import java.util.*; class Solution { public int[] solution(int[] answers) { int [] st1 = {1,2,3,4,5}; int [] st2 = {2,1,2,3,2,4,2,5}; int [] st3 ..
문제를 분석하고 입력값과 연산 횟수를 고려해 의사코드를 작성하고 시간 복잡도를 고민한 다음 코드를 작성했다. 활용한 것은 TreeSet인데 이 Set은 선언할 때부터 오름차순으로 정렬해주고 first()와 pollFirst() 같은 메서드를 활용해 가장 작은 값을 확인하거나 꺼내주는 기능을 한다. 따라서 별도로 배열 정렬할 필요가 없다. 여기서 잠깐 놓친 것은 pollFirst() 매서드를 사용함으로써 set의 크기가 동적으로 변하는데 변수로 저장해두지 않고 반복문의 길이를 size()로 설정했던 것이다. 실수를 깨닫고 변수로 받아 정적으로 활용했다. import java.util.*; class Solution { public int[] solution(int[] numbers) { TreeSet se..