슬라이싱 String > java ArrayList.subList(startidx, endidx); //원본 리스트의 값을 참조해서 슬라이싱 한다. 참조라 원본 리스트의 값이 바뀌면 이 녀석도 바뀜 Reverse String 직접적으로 지원하는 매서드 없음 Strin
최대공약수와 최소공배수를 그냥 구현할려면 대체로 비효율적인 알고리즘일 것 이다. 최대공약수와 최소공배수 알고리즘은 그냥 유클리드 호제법을 이용한 위 알고리즘을 외우는 게 좋다.
n이 작다면 그냥 1부터 n까지 모든 수를 루프를 이용해서 n에 나눠서 확인하면 된다. 그런데 n이 커지면 비효율적이라 제곱근을 이용한 알고리즘을 이용하자.A = B \* C 에서 B로 A를 나누면 C가 나와서 B는 A의 약수이다. 그럼 C로 A를 나누면 B나와서 무조
class Solution { public int solution(int board, int k) { int answer = 0; for (int i = 0; i < board.length; i++) { for
그냥 루프에 넣어서 체크하면 된다.
유클리드 호제법을 이용해서 a, b의 최대공약수를 구하고 b에 나눠줘서 기약분모로 만든다. 그런 다음 b가 2, 5로만 계속 나눌 수 있으면 1이 되고 아니면 1이 안되니 조건문 사용해서 답을 구해준다.
3개의 합은 3000을 넘지 않으니 에라토스테네스 체를 이용해서 3000까지의 소수를 구해준다. 파이썬과 달리 자바는 3개의 조합을 직접 루프를 이용해 구해주고 합을 체에 넣어서 소수면 answer에 1씩 더해 개수를 구한다.
일단 문자열을 스트림으로 변환하기 위해 .chars()를 붙여준다.그 다음 isDigit으로 숫자만 걸러서 정수형으로 만들고 정렬 후 배열로 만들면 끝
그냥 for 루프를 이용하면 쉬운 문제이지만 스트림에 익숙해지려고 일부러 스트림으로 푸는 중for 루프가 가독성이 좋아서 for루프로 푸는게 나을 것 같다.스트림 안에서 인스턴스 만들어서 사용가능하다고 해서 sliceArray 만들어서 사용함.
배열의 2개의 수를 큰거 작은거 나눠서 배열을 만들고 그 중 최댓값만 서로 곱해주면 됨
브루트 포스는 그냥 루프로 때려 맞추면 되는 것
파이썬은 라이브러리에 다 있는 데 자바는 없다. 참 곤란하다. 조합, 순열 같은거 많이 쓰여서 만들어 놨으면 좋겠는데 직접 구현해야 한다. 이번엔 조합을 구현해보자.우선 조합은 순서에 상관없이 숫자들을 뽑는 것이다. 알고리즘으로 적으로 다양한 방법으로 구현 할 수 있는
2진법두 비트가 모두 1인 경우에만 결과값의 해당 비트가 1이 됩니다.예시: 5 & 3의 결과는 1입니다. (0101 & 0011 = 0001)두 비트 중 하나 이상이 1인 경우, 결과값의 해당 비트가 1이 됩니다.예시: 5 | 3의 결과는 7입니다. (0101 | 0
자바에서 stack, ArrayList를 이용할 수 있으나 문제에선 입력수가 많기 때문에 ArrayDeque를 이용해준다. 스택에서 중요한 매서드는 push, pop, get, size가 있다. 그 중 push, pop이 중요한데 당연히 ArrayDeque에 구현이 되
큐에서 중요한 거 역시 push와 pop 스택과 다른건 선입선출이란 점 뿐중요 매서드는 다음과 같이 구현 할 수 있다.스택과 마찬가지로 이미 구현되어 있는 ArrayDeque를 이용했다.문제에서 효율을 위해서 StringBuilder 등으로 입력과 출력을 처리하였다.큐
저번 문제도 스택, 큐도 deque을 이용해서 풀었는데 addFirst, addLast, pollFirst, pollLast를 이용해서 이번엔 품스택은 값을 추가 하거나 삭제 할 때 리스트의 끝에 넣기 때문에 시간 복잡도가 O(1)이지만 큐의 경우 추가 하거나 삭제 할
그냥 함수 호출하지 말고 배열에 기록해서 가져다 쓰면 된다.
그림1 bfs와 dfs의 탐색 순서그래프 완전 탐색 기법 중 하나이다.bfs, dfs 모두 노드라는 분기점과 그 노드 사이를 연결하는 그래프를 가지고 있다. 따라서 구현에서 기록해야하는 건 노드를 방문했는지, 노드는 어떤 그래프를 가지고 다른 노드와 연결되어 있는 지
목적 현재 분기의 선택이 전체적으로 최선의 선택지라고 가정하는 알고리즘이다. 최적해를 얻는 것이 목표이다. 최적해를 보장할려면 분기들이 서로 독립관계이면 최적해가 보장된다. 수행 과정 해 선택 : 현재 상태에서 가장 최선이라고 생각되는 해를 선택한다. 적절성 검사
LRU라는 알고리즘을 처음 보면 상당히 당황스러운 문제이다. 하지만 LRU라는 알고리즘이 그렇게 어려운 내용이 아니여서 이해하기가 쉽다. 문제 풀다가 고민 되는점은 중간에 있는 도시를 어떻게 없애고 첫번째에 삽입하는 점이다.일반적으로 코딩테스트에 스택, 큐, 덱을 이용
Array.sort() 이용하면 쉽게 풀 수 있지만 버블 정렬을 연습하자.버블 정렬은 시간 복잡도가 O(n^2)로 느리지만 문제의 N이 1000까지라 무리없이 풀 수 있다.버블 정렬은 최대값을 일일이 찾아서 가장 오른쪽으로 밀어주는 과정을 반복한다.그러면 처음엔 가장
선택정렬을 이용해서 풀어봤다.선택정렬은 루프를 돌면서 최대값을 찾고 왼쪽이나 오른쪽으로 스위칭하면서 최대값을 밀어넣는다고 생각하면 된다.
그냥 Arrays.sort()로 풀어도 되는데 삽입정렬 연습하느라 삽입정렬로 풀었다.
결국엔 시계는 주기운동이다. 그리고 주기는 12시마다 초기화가 된다고 보면된다. 그래서 결국엔 24시간동안 시계가 겹치는 순간은 정해져있다. 지금 시간이 언제인지는 중요하지 않다. 무조건 시계가 겹치는 순간이 절대적으로 정해져 있다고 생각하고 풀면된다.그럼 모든걸 se
2차원 구간합 구하는 법원하는 원소(i, j)에서 한 칸씩 뺀 직사각형 (i-1, j), (i, j-1) 2개를 더해준다. 그리고 중복이 되는 (i-1, j-1) 직사각형을 뺴주고 (i, j)의 원소값을 더해주면 우리가 원하는 직사각형 부분합이 나온다.
백준 - 토마토 문제와 같이 정보를 저장하는 객체를 만들어주고 bfs를 실행할 때 객체 정보를 이용해 조건문을 만들어준다.hash맵으로 이동해주는 조건 체크해서 큐에 넣으면 해결
백준에 트리의 지름이 2가지가 있는 데 어려운 난이도의 풀이로 쉬운 것도 풀 수 있다. 양방향 그래프로 부모와 자식관계를 맺어준다.dfs를 이용해서 거리를 계산해주는 매서드를 만든다.임의의 점에서 dfs를 해줘서 트리의 끝점에 있는 아무점을 찾아준다. 양방향 그래프라
이거 정답 안 보고 어떻게 푸냐? 솔직히 여기서 행렬 떠올려서 분할 정복 떠올린 사람 있겠어?이걸 푸는 문제인데 이런 타입의 행렬을 푸는 접근법은 크게 2가지가 있다.컴퓨터가 풀어줘 위에 올린 풀이가 그것인데 우선 문제의 n이 너무 크기 때문에 시간 복잡도가 로그인 알
정렬기준을 priorityqueue로 구현한다. priorityqueue에는 물고기만 넣어주고 탐색을 진행할 queue를 따로 넣어준다. 모든 탐색을 마치면 priorityqueue의 물고기를 처리해주고 물고기 먹는 숫자도 세서 사이즈와 같으면 size++, 카운트를
왼쪽 서브트리를 인오더 순회한다.현재 노드(루트)를 방문한다.오른쪽 서브트리를 인오더 순회한다.인오더 순회 결과: 4, 2, 5, 1, 3왼쪽 서브트리를 포스트오더 순회한다.오른쪽 서브트리를 포스트오더 순회한다.현재 노드(루트)를 방문한다.포스트오더 순회 결과: 4,