자료구조 및 알고리즘 공부 및 문제풀이 저장소
Do it 자료구조와 함께 배우는 알고리즘 자바편을 읽으며 자료구조의 개념을 세웠다. 이젠 문제 풀이 시작!!
- [Docs] : README 문서에 풀이 정리
- [Algorithm] : 문제 풀이한 코드 커밋
구현
- Roman to Integer
- 풀이
- HashMap, stack 이용해 문제 풀이
- 테스트 시작 전 스택을 비워야함!
- Valid Parentheses
- 풀이
- 브라켓의 유효성 확인하는 문제.
- HashMap, stack 이용해 문제 풀이
- 테스 시작 전 스택 비우기!!
- Min Stack
- 풀이
- 최솟값을 구하는 stack 자료구조 구현 문제.
- 최솟값을 모아놓는 스택을 하나 더 구현해야 했는데, 나는 stream을 이용...
- Majority Element
- 풀이
- 배열 크기의 절반보다 빈도수가 많은 원소 구하기
- HashMap의 원소 값 추가하며 구현 : hashMap.merge(key, 1, Integer::sum);
- more than의 의미는 초과!
- Count Primes
- 풀이
- 양의 정수 n이하 소수의 개수를 구하기
- Arrays.asList()로 초기화하면 add, remove() 연산 시 unSupportedOperation 예외 발생
- Prime인지 계산할 때 <= 주의!! (어딘지 알지?)
- Vaild Anagram
- 풀이
- 두 개의 문자열이 anagram인지 판별하는 문제
- char[]는 stream으로 사용하려면 복잡하다. 그냥 for문 쓰기.
- replaceFirst()와 replace의 차이는 여러개를 바꾸냐 마느냐의 차이다.
- 반복문으로 해결되는 데 굳이 스택을 사용..
- 나머지 한 점
- 풀이
- 직사각형의 나머지 한점을 구하는 문제.
- 해시를 사용했지만 XOR를 이용하면 A, B, B 있을 때 A를 구하기가 쉽다.
- 방 번호
- 프린터 큐
- 에라토스테네스의 체
정렬
- ATM
- 풀이
- 동빈나의 알고리즘 풀이전략 영상 본 뒤 그리디 알고리즘 문제 풀이 시작
- 일주일만에 다시 알고리즘 공부 시작..! 하루에 한문제는 도전하기!
- List sort는 Collection.sort() 이용.
- 동전
- 풀이
- 금액을 주어진 동전들의 내림차순으로 나눈다. 나눈 몫이 0이 아닐 때 answer추가하고, 0이라면 다른 동전으로 나눈다.
- 나머지를 금액으로 초기화하고 반복한다.
- Intellij의 모든 code Completion을 끔.
- 테스트 코드를 작성하지 못해 아쉽다.
- 거스름돈
- 풀이
- 위의 동전문제와 동일
- 로프
- 풀이
- 주어진 여러개의 로프로 들수 있는 최대 중량 구하는 문제
- 로프를 오름차순으로 정리한 뒤 작은 값부터 로프의 개수 -1를 곱한다.
- 곱한 값 중 최대값이 정답
- List 오름차순은 Collections.sort(), 내림차순은 Collections.sort(list, Collections.reverseOrder());
- 30
- 풀이
- 주어진 숫자의 자리수로 가장 큰 30의 배수를 출력, 만들 수 없다면 -1 출력 문제.
- 자리수에 0이 없는지, 더한 자리수가 3의 배수인지로 확인 가능.
- 풀이보다 자바 문법익히는 데 시간이 더 걸림. 꾸준히해야 몸에 익을 거 같다.
- split("") 하면 한 단어씩 끊어진다.
- 기본형 배열 sort : Arrays.sort() / 역순 : Arrays.sort(list, Collections.reverseOrder()); 다만, 기본자료형 배열은 역순이 안된다.
- 인턴
- 풀이실패
- 주어진 남,녀,인턴 참가자로 만들 수 있는 최대 팀 수 구하는 문제
- 남 1, 여 2으로 2인 1조. 인턴 참가자는 제외하고 계산해야함.
- 설계를 잘 못 했는지 반례가 계속 나온다. 추후 도전
- 잃어버린 괄호
- 풀이
- 괄호가 없는 수식에서 괄호를 사용해서 최소값을 만드는 문제
- "+"를 split하려면 split("\+")라고 적어야함. 예약된 문자라 그렇다고 함.
- "-"를 기준으로 괄호를 만들면 된다.
- 기타줄
- 풀이
- 구매할 기타줄을 패키지와 낱개 가격을 이용해서 최솟값으로 구매하는 문제
- 패키지와 낱개의 최솟값을 모은 뒤 아래 경우의 수로 계산해서 그 중 최솟값을 출력하기.
- 3가지 경우
- 패키지 최소값으로만 구하기
- 낱개로만 구하기
- 두 개를 섞어서 구하기
- 스트림으로 최솟값을 구할 때 : candidate.stream().mapToInt(s -> s).min().getAsInt();
- getAsInt()가 경고가 뜨는데 어떻게 처리할 지는 고민해보기.
- 부등호
- 풀이
- 입력된 값을 파싱하는 코드만 추가
- 백트래킹, DFS, BFS와 관련된 문제라 개념 공부
- 인터넷 답안보고 해결
- 반도체 설계
- 풀이
- LIS(Longest Increasing Subsequence) 문제지만 길이만 같고 배열의 원소는 다름.
- Arrays.binarySearch() 사용 시 원소가 없으면 들어갈 자리가 음수로 나온다. 대신 들어갈 자리 시작은 1부터 시작.
- 줄세우기
- 풀이
- LIS 변형 문제.
- 아이들수 - (최장 증가 부분수열의 길이)
- 먹이사슬
- 풀이
- LIS 변형 문제.
- 최장 감소 길이 수열.
- 답을 봤지만 이해가 더 필요.
- Comparable 구현할 때 오름차순일 경우, 값을 비교한 뒤 작으면 -1, 크면 +1.
- 내림차순일 경우 값을 비교한 뒤 작으면 +1, 크면 -1.
- k번째수
- 풀이
- 기본 배열의 정렬을 이해한다면 풀 문제.
- 가장 큰 수
- 풀이
- Comparator를 잘 활용해서 풀어야하는 문제. 자릿수 별로 비교해 정렬하는 문제
- 통계합
전체탐색
문제 검색 : 문제 링크에 들어가서 각 문제 이름 검색하기
- KiwiJuiceEasy
- 풀이
- 문제를 차근차근 이해하면서 문제 풀어 보기.
- InterestingParty
- 풀이
- Arrays.asList()로 List 만들면 add, remove 연산을 사용할 수 없다.
- 기본 배열 합치려면 Collections으로 만들어야 한다.
- List list = new ArrayList<>(Arrays.asList(first));
- 주어진 배열을 합친 뒤 전체 탐색하는 문제.
- HashMap으로 문제 풀이 가능.
- Cryptography
- 풀이
- 전체 탐색 문제
- ThePalindrome
- 풀이
- 전체 탐색 문제.
- 테스트 코드와 디버거의 힘을 알 수 있었던 문제.
- FriendScore
- 풀이
- 전체 탐색 문제.
- 문제 이해를 위해 그래프를 그려봄.
- 전화번호 목록
- 분해합
- 한 줄로 서기
- 덩치
- 영화감독 숌
DFS/BFS
- 타켓넘버
- 풀이
- BFS 기본 문제. 개념만으로는 풀 수 없고 응용을 해야 한다.
- 네트워크
- 풀이
- Union-Find를 이용한 문제.
- DFS와 BFS
- 풀이
- 주어진 정점간의 관계를 이차원 배열로 표현한 뒤 dfs, bfs
- 바이러스
- 풀이
- Union-Find를 조금 응용한 문제
- 미로찾기
- 풀이
- DFS를 큐로 구현하는 기본 문제
- 그림
- 풀이
- DFS를 응용한 문제
- 토마토
- 풀이
- 여러 시작점이 있는 DFS 문제
- 불!
- 풀이
- 시작점이 다른 종류인 DFS 문제
- 숨바꼭질
- 풀이
- 1차원 배열 BFS 문제
- 단지번호붙이기
- 풀이
- 여러 시작점이 있지만 서로 구분해야 하는 문제
- 적록색약
- 풀이
- 여러 시작점이 있고 시작점의 유형을 구분해야 하는 문제
- CrazyBot
- 풀이
- DFS이용한 전체 탐색 문제.
- 좌표 방향에 대한 이해가 오래걸렸던 문제.
- 유기농배추
- 풀이
- 가로가 먼저 입력되니까 행과 열을 반대로 잘 처리해야하는 문제
- 연결 요소의 개수
- 풀이
- 평범한 union-find 문제