자바 114

[백준 2206번] 벽 부수고 이동하기 - java

문제 설명 1. N x M 크기의 맵이 나타난다. [ 0은 이동가능 ] [ 1은 이동불가 ] 이다. 2. 근데 벽을 한번은 부수고 이동할 수 있다. 3. 0, 0 -> N-1, M-1 로 가는 최소거리를 구해라~ 풀이 과정 1. 최소거리 -> BFS를 이용하고 벽을 부수는 것은 class내에 벽을 부술 수 있는 값을 주면 된다. 2. 최소 거리를 구하는 경우 BFS를 사용하고 간 길을 check해 주면, 뒤에 도달하는 경우 무조건 현재상황보다 늦게 도달하거나, 동시에 도달함으로 check해 준 길을 다시 오지 않게 해 주면 된다. 3. 그런데 만약에 한번 벽을 부수어서 그냥 오는 것보다 빠르게 해당 route에 도달했는데, 목적지에 도달하려면 목적지 앞의 벽을 부숴야 하는 경우가 생긴다면 곤란할 것이다...

알고리즘 공부 2021.12.25

[백준 3020번] 개똥벌레 - java

문제 설명 1. 동굴의 길이 N, 높이 H미터가 주어진다. 2. 동굴의 길이에 맞춰 장애물이 석순 / 종유석 이렇게 번갈아가며 주어진다. 3. 개똥벌레는 그 장애물을 그냥 뿌수고 지나간다. 4. 개똥벌레가 부수는 최소의 장애물 개수와 그 경우가 몇 개인지 구하면 된다. 풀이 과정 1. 이분 탐색 문제라는데...내가 푼게 이분 탐색이 맞나? 그냥 구현 + DP로 푼 느낌이다. 누적합 2. 먼저 배열을 하나 만들어서 장애물의 높이에 따른 개수를 가져간다. 예를 들어 2가 입력되면 arr[2]++ 이런식으로. 3. 그리고 석순 / 종유석 이렇게 번갈아가면서 주어지기 때문에 두 개의 배열은 각각 다르게 설정하고, 번갈아가면서 하나씩 넣어준다. 4. 입력받은 장애물을 표현하자면 1 5 3 3 5 1 이렇게 주어지..

알고리즘 공부 2021.12.24

[백준 1074번] Z - java

문제 설명 1.2^N x 2^N 크기 배열에 대해 배열의 N, x축 r, y축 c가 주어진다. 2. Z모양으로 0, 1, 2, 3 ... 이렇게 숫자가 하나씩 늘어나며 들어간다. 3. r,c위치에 존재하는 숫자를 구하면 된다. 풀이 과정 1. 가장 전형적인 분할 정복 문제이다. 2. r, c의 위치를 생각할 때에 전체 배열을 4가지 범위로 나누어 찾으면서 구해나간다. ex 초록색으로 존재하는 위치의 값을 찾으려 한다고 생각해 보자 전체 크기를 기준으로 4개의 frame으로 나누어서 현재 frame은 4번째에 해당한다. 그렇다면 현재 위치 이전의 모든 frame에 해당하는 숫자들을 더한 숫자로부터 시작하면 된다. 파란영역 크기 전체 + 빨간영역 크기 전체 + 노란영역 크기 전체 -> 초록색 영역이 존재하는..

알고리즘 공부 2021.12.22

[백준 1495번] 기타리스트 - java

문제 설명 1. 연주할 곡 N, 시작 볼륨 S, 최대 볼륨 M이 주어진다. 2. N개의 변경할 볼륨의 크기가 주어진다. 3. 모든 곡의 볼륨은 최대 볼륨 M을 넘어서는 안된다. 4. 마지막 곡에 연주 가능한 최대 볼륨을 구하면 된다. 풀이 과정 1. DP를 사용하는 문제이고, 적용 시점을 잘 고민해 봐야 한다. 2. 먼저 DP의 범위를 볼륨 M으로 설정하고, DP[A]의 값은 그 연주 시점으로 설정한다. 3. 예를 들어, 2번째 곡이 4, 8의 볼륨으로 연주 가능하면 DP[4] = 2, DP[8] = 2 이런 식이다. 4. 처음에 DP[S] = 0으로 설정하여 시작 볼륨을 구한다. 5. 다음 볼륨을 구하려면 현재 시점의 곡 순서에서 이전 시점에 불린 곡(DP[X]=현재시점-1 의 X값) 의 정보를 통해 ..

알고리즘 공부 2021.12.19

[백준 14226번] 이모티콘 - java

문제 설명 1. S가 주어진다. 1개의 이모티콘을 갖고 있다. 2. 1초마다 전체복사/붙여넣기/지우기 중 하나를 할 수 있다. 3. 1개의 이모티콘 -> S개의 이모티콘 을 만드는 최소의 연산을 구하면 된다. 풀이 과정 1. BFS를 생각하고 풀었는데, BFS적용 자체는 간단하지만 시간복잡도에서 터지지 않게 하는 것이 복잡했다. 2. BFS풀이법 - Queue를 구현한다. Queue는 ( 현재이모티콘수, 복사한이모티콘수, 걸린시간 ) 세 개의 구성을 갖는 class를 갖는다. - 시작은 1, 0, 0이다. ( 처음이모티콘 1개, 복사x, 0초) - 1초마다 걸리는 연산은 복사하기, 붙여넣기, 지우기이다. - 복사하기 : Queue에 ( 현재이모티콘수, 현재이모티콘수, 걸린시간+1 ) 을 해주면 된다. -..

알고리즘 공부 2021.12.16

[백준 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칸이며,..