java 121

[백준 2075번] N번째 큰 수 - java

문제 설명 1. N x N행렬이 주어진다. 2. 숫자들이 주어진다. 3. N번째에 해당하는 숫자를 구하면 된다. 풀이 과정 1. 이거 우선순위 큐를 이용해서 풀었는데, 내가 볼 때에는 문제의 조건 중 하나인 '아래 줄이 윗 줄의 숫자보다 크다'를 이용하려면 우선순위 큐를 두 번 사용하는게 좋을 것 같기는 하다. 2. 그런데 왜인지는 모르겠지만 그걸 쓰지 않고도 해결이 되었다(시간복잡도에서 손해를 많이 보는데도 통과된게 이상한 느낌) 3. 먼저 우선순위 큐를 사용하면 오름차순으로 정리되는데, 우선순위 큐에 큰 순서대로 N개를 저장해서 갱신해주면 맨 위가 해당 답이 될 것이다. 4. 그렇다면 총 N개가 N번 들어오기 때문에 처음에 N번 받을 때는 우선순위 큐에 모든 숫자를 받아준다. 5. 다음부터는 숫자를 ..

알고리즘 공부 2021.12.14

[프로그래머스] 행렬 테두리 회전하기 - java

문제 설명 1. 핼렬의 크기, 회전할 영역이 주어진다. 2. 그 영역을 회전시키고, 회전한 값들 중 가장 작은 값을 저장한다. 3. 출력하면 된다. 풀이 과정 1. 간단한 구현 문제이다. 2. 하나씩 이동하면 된다. 3. 현재 위치의 값을 locNum로 저장한다. locNum값을 temp에 저장한다. 이후 다음 위치로 이동한다. 4. 현재 위치의 값을 locNum에 저장한다. 현재 위치에 temp값을 저장한다. 이후 다음 위치로 이동한다. 5. 위의 3, 4로직을 시작부터 끝까지 프레임에 맞추어 진행하면 된다. 6. 실제 코드를 보면 쉽게 이해 가능하다. 코드

알고리즘 공부 2021.12.11

[백준 2668번] 숫자고르기 - java

문제 설명 1. 세로 두줄, 가로 N칸짜리 표가 주어진다. 2. N에 해당하는숫자들이 주어진다. 3. 0번Line숫자 -> 1번Line숫자 ->0번Line숫자 로 돌아오는 숫자들을 오름차순으로 출력한다. 풀이 과정 1. DFS와 Prority Queue를 이용하여 풀이한다. 2. 문제의 주요 골자는 map에 각 숫자를 적어두고 map[i]와 map[map[i]] 이런 식으로 함수를 쭉쭉 돌리면서 자기 자신의 숫자가 나타나면 되는 것이다. 1 2 3 4 5 3 5 1 5 1 map[1] = 3, map[map[1]] = 3 3. DFS에서 값들을 체크하면서 i -> map[i] -> map[map[i]] -> map[map[map[i]]] ..... 이렇게 도달하지 않은 곳까지 체크한다. 4. 자기 자신이..

알고리즘 공부 2021.12.02

[백준 1629번] 곱셈- java

문제 설명 1. A, B, C가 주어진다. 2. A를 B만큼 곱하고 이를 C로 나누는 문제이다. 풀이 과정 1. 당연히 그냥 구하면 터진다. 2. 이걸 생각하면 쉽다. A^16 = (((A^2)^2)^2)^2 A^17 = A*(((A^2)^2)^2)^2 3. long형 함수에 B번 반복하기 위해 B를 인자로 넣고 재귀함수를 돌린다. 4. 그 다음 재귀에서 구해진 값을 재곱하고 C로 나누는 것을 반복하면 된다. 5. 그리고 인자가 홀수가 되면 그냥 A를 곱해주면 되는데, 이 이유는 홀수 인자를 갖는 경우는 재귀함수가 인자 1을 가질때까지 반복되거나, 시작할 때 홀수인 경우 두 개 밖에 없기 때문이다. 6. 조금만 생각하면 쉽게 구현할 수 있는 문제이지만, 아이디어를 구현하는것에서 문제가 생기면 오래 걸릴 ..

알고리즘 공부 2021.11.28

파트3. 함수 작성 - 메모장

문제 설명 한 줄에 K자를 적을 수 있는 메모장에 영어 단어들을 적으려 합니다. 영어 단어는 정해진 순서로 적어야 하며, 단어와 단어 사이는 공백 하나로 구분합니다. 단, 한 줄의 끝에 단어 하나를 완전히 적지 못한다면, 그 줄의 나머지 부분을 모두 공백으로 채우고 다음 줄부터 다시 단어를 적습니다. 예를 들어 한 줄에 10자를 적을 수 있고, 주어진 단어가 순서대로 ["nice", "happy", "hello", "world", "hi"] 인 경우 각 줄에 다음과 같이 적을 수 있습니다.('_'는 공백을 나타냅니다.) 첫째 줄 : "nice_happy" 둘째 줄 : "hello_____" 셋째 줄 : "world_hi" 이때, 둘째 줄에 "hello"를 적으면 단어를 적을 수 있는 남은 칸은 5칸이며,..

파트3. 함수 작성 - 숫자 뽑기

문제 설명 자연수가 들어있는 배열에서 숫자 K개를 선택하려 합니다. 이때, 선택한 숫자 중 가장 큰 수와 가장 작은 수의 차이가 최소가 되도록 해야합니다. 예를 들어 배열에 들어있는 숫자가 [9, 11, 9, 6, 4, 19] 이고, K = 4 라면 숫자 4개를 [9, 11, 9, 6]로 뽑으면 (가장 큰 수 - 가장 작은 수) = (11 - 6) = 5가 됩니다. [9, 9, 6, 4] 와 같이 숫자를 뽑아도 (가장 큰 수 - 가장 작은 수) = (9 - 4) = 5가 됩니다. 그러나 가장 큰 수와 가장 작은 수의 차이가 5보다 작아지도록 숫자 4개를 선택하는 방법은 없습니다. 자연수가 들어있는 배열 arr, 선택해야 하는 숫자 개수 K가 매개변수로 주어질 때, 선택한 숫자중 가장 큰 수와 가장 작은 ..

파트3. 함수 작성 - 꽃피우기

문제 설명 정사각형 크기 격자 모양 정원에 칸마다 핀 꽃 또는 피지 않은 꽃을 심었습니다. 이 정원의 꽃이 모두 피는 데 며칠이 걸리는지 알고 싶습니다. 핀 꽃은 하루가 지나면 앞, 뒤, 양옆 네 방향에 있는 꽃을 피웁니다. 현재 정원의 상태를 담은 2차원 배열 garden이 주어졌을 때, 모든 꽃이 피는데 며칠이 걸리는지 return 하도록 solution 메소드를 작성해주세요. 매개변수 설명 현재 정원 상태를 담은 2차원 배열 garden이 solution 메소드의 매개변수로 주어집니다. 정원의 한 변의 길이는 2 이상 100 이하입니다. 정원 상태를 담은 2차원 배열 garden의 원소는 0 또는 1 입니다. 이미 핀 꽃은 1로 아직 피지 않은 꽃은 0으로 표현합니다. 정원에 최소 꽃 한 개는 피어..

파트1. 빈 칸 채우기 - 지그재그 부분 수열

문제 설명 수열 S가 주어질 때, 이 수열의 연속된 부분 수열 중 지그재그 수열 길이의 최댓값을 구하려 합니다. 지그재그 수열이란 첫 번째 원소부터 인접한 원소의 차이가 증가 → 감소 → 증가 → 감소 ... 혹은 감소 → 증가 → 감소 → 증가 ... 순으로 나타나는 수열을 말합니다. 단, 수열의 길이는 3 이상이어야 합니다. 예를 들어 수열이 [ 2, 5, 7, 3, 4, 6, 1, 8, 9]인 경우, 연속된 부분 수열 [5, 7, 3, 4]가 부분 수열 중 가장 긴 지그재그 수열이 됩니다. 부분 수열 중 가장 긴 지그재그 수열의 길이를 구하기 위해 다음과 같이 프로그램 구조를 작성했습니다. 1. 각 숫자가 바로 이전 숫자보다 증가했는지, 혹은 감소했는지 표시한 배열을 만듭니다. 1-1. "증가"는 ..

파트1. 빈 칸 채우기 - 스택으로 큐 구현

문제 설명 스택 두개를 이용해 Queue 자료구조를 만들었을 때, Queue 자료 구조의 pop(또는 dequeue) 메소드를 구현하려합니다. Queue란 먼저 삽입한 데이터를 먼저 빼내는 자료구조를 뜻합니다. pop 메소드를 만들기 위해 다음과 같이 프로그램 구조를 작성했습니다. 1. 스택2가 비었다면 스택1에 아무것도 남지 않을때까지 스택1에서 pop한 값을 스택2에 push 한다. 2. 스택2에서 pop한 값을 리턴한다. 두 어레이리스트 stack1, stack2가 매개변수로 주어질 때, 두 어레이리스트를 스택으로 이용해 Queue 자료 구조의 pop 메소드를 구현하려합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 메소드와 매개변..

[백준 16929번] Two Dots - java

문제 설명 1. 공의 크기 X,Y 그리고 각 공들이 chr로 주어진다(문자열로 주어진걸 chr로 받는다.) 2. 같은 문자의 공들은 서로 연결 가능하다. 3. 공을 연결하여 사이클이 완성되도록(시작점부터 다른 점을 연결해 다시 시작점까지 연결될수 있도록) 할 수 있는지 구하면 된다. 4. 사이클의 크기는 4이상이 되어야 한다(가장 작은 사이클은 4이다. 연결점이 4개이기 때문) 풀이 과정 1. 기초적인 DFS문제에 적절한 조건을 추가한 문제이다. 난이도가 높은 편은 아니라 금방 이해할 수 있을 것이다. 2. 기존에 수행할 수 있는 DFS에 추가로 count(4이상으로), start Dot를 저장하여 비교하면 된다. 3. 즉 DFS를 수행하여 현재점부터 상하좌우로 이동하는 xTo, yTo를 만든 후, 그 ..

알고리즘 공부 2021.11.27