문제 바로가기같은 depth에 해당하는 만큼 queue에서 빼내주는 방식을 생각해냈어야 한다.또한, 시작점이 왼쪽 하단이고 목표 지점이 오른쪽 상단인데 인덱스를 헷갈리지 않고 잘 쓰도록 하자.이부분에서 dxj가 아니라 dxi로 써버렸는데, i와 j가 크게 구분이 안되어
문제 바로가기처음 풀었을 때는 depth와 remain을 각각의 static 변수로 선언하고, bfs 메서드 내에서 경우를 분기하여 더하고 빼고 확인하는 과정을 거쳤었다.다만 그 풀이는 메모리 초과가 났다.결국 이 문제의 요지는 visited에서 한칸씩 앞뒤로 움직이는
문제 바로가기input으로 주어지는 노드들 사이에 빈칸이 주어져서 StringTokenizer를 사용하였다. 다만 BufferedReader를 사용해 readLine()을 쓸만큼 각 문장이 길지는 않아서 효율적인가에 대해서는 한번 생각해봐야 할 것 같다.다만 Scann
문제 바로가기경로에 따른 weight 라던지 value 값이 따로 없었던 기본적인 dfs 문제였다. 따라서 stack 과 같은 다른 자료구조들을 굳이 쓸 필요가 없었다.
문제 바로가기쉬운 그리디 문제였지만 조건문의 분기를 확실하게 해야한다. 또한 for문에서 인덱스 bound를 잘 생각해야한다.
문제 바로가기n = 100,000 이고 모든 카드 묶음이 1,000일때 누적합은 int 값의 범위를 넘어설 수도 있을 것 같아서 PriorityQueue에 들어갈 데이터 type과 변수 ans를 각각 Long과 long 으로 선언해주었다.문제를 다 풀고나서 실험해보니
문제 바로가기최악의 경우 1,000,000,000이 5000개 들어있는 배열이 input으로 들어올 수 있으므로 이런 큰 수를 다룰때는 처음부터 long type으로 명시해두는 것이 좋다. 다만 인덱스를 담는 변수나 배열은 int 형으로 선언하였다.이 문제를 브루트포스
문제 바로가기 나의 풀이 평범한 다익스트라로 풀었다. 파이썬으로 할때보다 확실히 구현이 많이 복잡해져서 풀이가 맞기는 했지만 시간도 1000ms에 가깝고, 메모리도 거의 100MB 가까이 사용해서 좀 더 효율적인 두번째 풀이까지 생각해보았다. 첫번째 풀이 두번째
문제 바로가기다익스트라를 2번 써주는 문제이다. 다만 문제를 풀다보니 스스로 너무 많은 생각을 해서 오히려 시간을 많이 써버렸다.내가 착각한 것은 start - v1 - v2 - end 경우와 start - v2 - v1 - end 경우 뿐만 아니라 start - v
문제 바로가기트라이를 사용하여 문제를 해결하였다. 트라이 노드는 해시맵으로 구성해서 특정 문자(키)가 입력되면 해당하는 자식 노드로 이어지도록 구성하였으며, 해당 노드에는 boolean 변수를 선언하여 마지막인지 아닌지 체크하도록 하였다.트라이 자료구조는 root 노드
문제 바로가기스택을 활용하면 간단하게 풀 수 있는 문제였다.
문제 바로가기삼성 SW 역량 테스트 문제에 좋은 구현 문제들이 많다고 해서 풀기로 마음먹고 풀어본 첫 문제이다. 확실히 구현을 대비를 안했던 만큼 어려웠고 결국 다른 사람들의 풀이를 조금은 참고해서 풀이를 할 수 있었다.나도 처음에 문제를 봤을 때, 빡 구현을 해야할
문제 바로가기처음에는 조합으로 구한 숫자들을 인덱스로 삼아 character 배열을 만들어보고, 모음이 1자 이상, 자음이 2자 이상 들어갔을 때는 StringBuilder에 append 해줘야 겠다는 생각을 했다.다만 문제를 풀기 위한 방식이라기 보다는 내가 조합을
문제 바로가기처음에는 이차원 배열인 map을 만들어 실제로 석순과 종유석이 존재하는 위치에는 1씩 더해줘서 그래프를 만들고, 각각의 행을 더한 값 중에서 최소값을 구하는 식으로 문제를 풀었지만 메모리 초과가 났다!메모리 초과를 해결하기 위해서 h 길이를 가진 1차원 배
문제 바로가기회전 초밥 접시의 수가 최대 3,000,000 이고 초밥의 종류가 최대 3,000 개라서 모든 슬라이드에 대해 for문을 돌리고, 최대값을 각각 구해내면 시간 초과가 난다.따라서 투포인터를 이용한 슬라이딩 윈도우 알고리즘을 사용해야한다. 앞쪽에서 하나 빼주
문제 바로가기문제에서 노드를 구현할 필요 없이 list에 자식 노드의 목록을 넣어주는 식으로도 풀 수 있었으나, 노드를 직접 구현해서 tree 구조를 만들어 보려고 다른 분들의 풀이를 조금 참고하여 풀어보았다.
문제 바로가기소수인지 아닌지 매번 확인하면 시간초과가 반드시 날것이라 생각해서 '에라토스테네스의 체'를 활용해 list에 4백만까지의 숫자 중에서 소수만을 넣어주었다.그 이후에는 단순히 투포인터를 활용해서 더해줬는데, 내가 실수했던 부분이 left와 right의 시작점
그리디를 활용하는 문제를 더 많이 풀어봐야겠다고 느꼈다.풀이 방법은 map에 각 문자의 자리수만큼을 계속 더한다. 예를 들어, 문자 'B' 가 십의 자리에 1번, 만의 자리에 2번 나왔다면 map에서는 ('B', 20010) 이 들어있도록 해준다.그 map의 entry
문제를 읽고나서 시간 복잡도를 보고 누적합 알고리즘을 사용하면 되겠다는 아이디어는 바로 떠올랐다. 하지만 처음에는 jungle, ocean, ice 2차원 배열을 각각 선언하고 3개의 배열을 각각 누적합해줘서 시간 초과가 났다.해결책은 3개의 2차원 배열을 3차원 배열
처음에는 word 크기에 해당하는 배열을 substring으로 잘라낸 후, 이것이 word의 각 문자의 개수와 같은지 일일이 확인해주는 브루트포스가 떠올랐다. 하지만 이는 시간 복잡도가 O(g\*|S|) 이므로 이 문제에서는 90억번의 연산이 필요해진다.곧바로 이 문제
문제 바로가기입력 배열을 받을 때, visited 배열을 추가로 하나 더 만드는 것보다 3차원 배열을 선언해두고 map\[i]\[j]\[1]에 방문하지 않았으면 0, 방문했으면 1을 표시해두었다.또한 배열 값을 space를 한칸씩 추가해가면서 출력해야하는데, java의
이전에 한번 풀었었던 문제인데도 20분동안 어떻게 풀지, 무슨 알고리즘 유형의 문제인지 계속 고민했었다...최대 K개의 집중국의 수신 가능 영역의 길이의 합의 최솟값을 출력이라는 부분에서 최대 중에서 최소값을 구해야한다? 라는 생각이 들면서 DP 문제인가 했다가도 어떻
문제 바로가기처음에는 쉽게 봤다가 예외 처리에 애먹은 문제이다. 나는 list를 두개 만들어두고 (삭제해야하므로 배열 안씀)음수는 left에 (넣어줄 때는 절대값으로)양수는 right에 넣었다여기서 중요한데 두개를 각각 sort한 다음, 각각에서 제일 멀리 있는 원소를
문제 바로가기트리를 구현하기 위해 Node 클래스와 nodeList를 내부적으로 가진 Tree 클래스를 만들어야했다.대문자 A, B, C 등으로 주어지지만 우선 정수형으로 변환하여 트리를 만들었고 출력해줄 때 다시 문자형으로 파싱하여 출력해주기로 했다.전위, 중위, 후
문제 바로가기문제를 읽으면서 구현 문제인지는 파악했고, 더 이상 아래 방법에 의해 인구 이동이 없을 때까지 지속된다 이 구문에서 끝날 때까지 반복되는 것을 구현해야하는 구나.. 그냥 브루트포스로 풀어야겠다고 생각했습니다.처음에는 실제로 국경선과 일치하는 boolean\
문제 바로가기visited\[]\[] 배열을 사용해서 행, 열, 대각선에 대해 모두 방문 체크를 하는 백트래킹을 구현해봤으나 직전에 방문체크했던 곳을 해제하는 과정이 쉽지 않아 결국 구글링을 해봤습니다.구글링으로 나온 결과에서는 대부분 1열, 2열, .. 순서로 퀸을
문제 바로가기crane이 들 수 있는 무게와 box의 무게들을 모두 ArrayList에 저장하였다. 더 이상 box들을 들 수 없는 crane이나 이미 배에 적재한 box는 제거해주기 위함이었다.두 list를 역순으로 정렬해주었고 crane이 들 수 있는 무게 중 가장
문제 바로가기투포인터나 슬라이딩 윈도우를 활용하면 되는 문제이다. 사실 성능을 더 높이기 위해서는 remove 했을때 마이너스 값이 된 것이 있으면 add와 세트로 모든 값이 다시 0이상이 될때까지 반복되는 loop를 만들어주면 된다.다만 여기서는 그냥 단순하게 1칸씩
문제 바로가기A를 B로 바꾸는 것보다 B를 A로 만들어가는 문제이다.A를 B로 만들어가려면 2가지 경우에 대해 모두 고려해야하는 반면에 B에서 A로 가는 경우는 끝자리의 문자가 'A'인지 'B'인지에 따라 한가지의 경우만 고려하면 되기 때문이다.문자열의 길이가 같아질
문제 바로가기처음에는 각각의 사이클에 대해서 최대의 길이를 가진 하나의 사이클을 구하는 문제인 줄 알았다..다시보니 각각의 사이클을 모두 더한 리스트를 구하는 것이 문제의 답이었다.당연히 DFS를 통해 index -> value -> index -> value 이런 식
문제 바로가기Point 클래스에 row와 col, value 값을 넣어두고 PriorityQueue 를 사용해서 매번 가장 큰 값을 꺼낼 수 있도록 했습니다. value 값을 비교해서 꺼내기 위해 CompareTo 메서드를 오버라이딩 했습니다.
문제 바로가기구현 문제인 만큼 풀이가 많이 복잡했다. 풀고나서 다른 사람들의 풀이를 봤는데 나만큼이나 복잡하게 풀어낸듯 하다.문제의 요지는 한칸씩 돌리면 시간 초과가 나기 때문에 r 만큼 한번에 돌려줘야 한다.나는 그림을 그려가며 n, m이 어떻게 주어지든 항상 한 껍
문제 바로가기이번 풀이는 가장 효율적인 풀이는 아니다.사실 이 문제에서는 굳이 Node나 Tree를 만들 필요 없이 Graph를 만들어놓고 dfs를 해도 되는 문제다.다만 나는 Node와 Tree 구현을 좀 더 연습하고자 복잡한 풀이를 쓰게 되었다.사실 마지막 coun
투포인터를 이용해서 풀었고 거리 비교는 절댓값으로 계산해야하므로 Math.abs()를 사용했다.처음에는 서로 다른 정수로 구성된 배열이 주어진다는 조건을 보지 못해서 조건 분기가 굉장히 복잡했다.이 조건으로 인해라는 구문이 가능해졌고 조건 분기가 상당히 깔끔해졌다.조건
문제 바로가기Meeting 클래스에 회의 시작 시간과 종료 시간을 속성으로 가지도록 했다. 또한 reservation 우선 순위 큐에서 시작 시간 순서대로 회의를 꺼내오기 위해 compareTo() 메서드를 오버라이드했다.반면에 continuing 우선 순위 큐에서는
문제 바로가기쉬운 문제였다. 선 자체는 최대 백만개가 주어지므로 반복이 되어도 상관없지만, 값은 -10억 ~ 10억까지이므로 전체 범위를 순회하는 것은 시간 초과가 날 것이다.따라서 Line 이라는 클래스를 만들고, 시작 시간을 기준으로 다른 객체와 비교하여 오름차순으