전체 글 348

[백준 2470번] 두 용액- java

문제 설명 1. N이 주어진다. 2. N개의 배열에 해당하는 -1000000000~1000000000까지 범위의 용액들이 주어진다. 3. 용액을 섞었을 합의 절대값이 0에 가장 가까운 값을 return하면 된다. 풀이 과정 1. 이분 탐색 문제이다. 2. 배열 정렬 후, 최대+최소를 구해서 이게 0보다 크면 최대값을 줄이고 0보다 작으면 최소값을 키운다. 3. 그리고 구할 때 마다 정답을 바꾸어 주면 된다. (범위가 -1000000000~1000000000니까 최대값은 2000000000) ex) -2 4 -99 -1 98 이렇게이면 정렬 -> -99, -2, -1, 4, 98 합 -> (-99+98) = -1 [정답 변경!] 0보다 작음 -> (-2+98) = 96 [정답 그대로] 0보다 큼 -> (-..

알고리즘 공부 2021.09.23

[백준 1780번] 종이의 개수- java

문제 설명 1. N이 주어진다. 2. NxN배열에 해당하는 종이들이 -1, 0, 1로 주어진다. 3. 한 범위의 모든 종이들이 해당 숫자로 이루어진 경우들을 구한다. 4. 범위는 전체 크기 사이즈를 가로세로를 3으로 나눈 총 9개의 범위로 이루어져 있고, 해당 범위에 다른 종이가 있으면 다시 나누어 준다. 5. -1, 0, 1 각각 얼마나 많은 '범위'가 존재하는지 구하면 된다. 풀이 과정 1. 분할 정복 문제이다. 2. 값들을 더 작은 수로 나누고, 그곳에서부터 조합해 맞추어 나가면 된다. 3. 이전 글의 쿼드 트리와 유사한 문제이다. 그냥 범위를 더 잘게 나누고, 괄호를 없애면 된다. 4. 전체 범위에 대해 다른 숫자가 존재하는지 판단하고, 있으면 더 잘게 나누고 없으면 지금 숫자를 해당 배열에 더해..

알고리즘 공부 2021.09.22

[백준 1992번] 쿼드트리- java

문제 설명 1. N이 주어진다. 2. NxN배열에 해당하는 숫자들이 주어지고, 1은검은색, 0은흰색이다. 3. 주어진 배열을 왼위/오위/왼아/오아 이렇게 4부분으로나누어 다1이면 1, 다0이면 0을 받는다. 4. 만약 전체가 1또는 0이 아닌 경우 또 4부분으로 나누어 풀이한다. 5. 저 크게 나누면 괄호로 표시해 준다. 그렇게 구한 답을 return하면 된다. 풀이 과정 1. 분할 정복 문제이다. 2. 값들을 더 작은 수로 나누고, 그곳에서부터 조합해 맞추어 나가면 된다. 3. 전체 크기에 대해 모두 같은 영역으로 이루어졌는지 판단하고, 맞으면 그 숫자를 더해주며 아닌 경우 다시 분할해 주면 된다. 4. 예를 들어 모두 1인 경우 - 그냥 답에 1 더하기 중간에 다른 답이 있는 경우 - 괄호를 펼쳐주고..

알고리즘 공부 2021.09.21

[백준 1057번] 오르막 수- java

문제 설명 1. N이 주어진다. 2. 수가 오름차순이어야 한다(현재 자리수의 전에 지금보다 '큰'숫자가 와서는 안된다. 3. 설명할게 더 없다. 풀이 과정 1. DP로 문제를 풀었다( bottom-up으로 풀었음) 2. 이전에 풀었던 쉬운 계단 수 를 보고 생각해보면 거의 비슷한 문제이고, 굉장히 쉽게 풀 수 있을 것이다. 3. 요점은 이전까지의 모든 숫자에 현재 숫자를 더하면 된다는 것이다. 4. 예를 들어 3개 자리수의 4라는 숫자가 있으면 앞에서 (3으로 끝나는 2개 자리수 숫자 전체 수) + (2로 끝나는 2개 자리수 숫자 전체 수) ... 이렇게 하면 된다. 5. 솔직히 더 설명할게 없다... 이제 슬슬 더 어려운 내용들을 풀어야 하는데, 난이도가 높아지니 문제 풀이가 조금 힘들어지는 것다. 코..

알고리즘 공부 2021.09.20

[백준 1002번] 터렛- java

문제 설명 1. 터렛1의 좌표 x,y와 마린의 거리r 터렛2의 좌표 xy와 마린의 거리 r 이게 순서대로 주어진다. 2. 마린이 있을 수 있는 위치를 구하면 된다. 3. 있을 수 있는 좌표가 많은 경우 -1을 return하면 된다. 풀이 과정 1. 이건 그냥 수학문제인데 엄청 간단하다. 2. 터렛1, 2에서 마린까지의 거리에 대해 원이 그려질 것이다. ex) (0, 0)위치에서 마린까지 거리가 2이면 반지름 1짜리 원이 그려지겠지 3. 터렛 1, 2와 거리로 그려지는 원에 대해 - 무한한 좌표가 나오려면 둘이 완전히 같은 원이면 된다. - 아예 겹치지 않는 경우는 반지름의 차이가 거리보다 크거나, 거리의 합이 반지름의 합보다 크거나이다. - 좌표가 1개밖에 없는 경우는 반지름의 차이가 거리의 차이랑 같거..

알고리즘 공부 2021.09.15

프로그래머스 위클리 챌린지 7주차 - java

문제 설명 1. 들어온 사람, 나온 사람이 주어진다. 2. 사람들이 차례로 들어오고, 현재 들어온 사람중 나온 사람에 해당하는 사람이 있으면 순서대로 나간다. ex) enter -> [1, 4,3, 2] leave -> [3, 4, 2, 1] ----> 1번 입장, 4번 입장, 3번 입장, (여기서 leave의 처음인 3이 들어왔으니까) 3번 퇴장, 4번 퇴장, 2번 입장, 2번 퇴장, 1번 퇴장 요런식 3. 입장한 사람들끼리는 서로 만난다. 3. 만난 사람들의 수를 return한다. 풀이 과정 1. 굉장히 간단한 문제이다. 2. 선입선출법이니까 Queue를 사용하고, 사람들의 입/퇴장을 세 주므로 ArrayList로 사람들을 구한다. 3. 전부 다 나가면 계산이 종료되므로 leave관련 queue가 사..

[백준 11727번] 2xn 타일링 2- java

문제 설명 1. 2x1, 1x2, 2x2 세가지 타일로 2xn의 타일을 채워야 한다. 2. 채우는 모든 방법을 구하면 됨. 3. 설명할게 더 없다. 풀이 과정 1. DP로 문제를 풀었다( bottom-up으로 풀었음) 2. 2x1을 채우는 방법은 1개, 2x2를 채우는 방법은 3개이다(11, 二, ㅁ) 3. 2x3을 채우려면 2x2타일 뒤에 1짜리 하나를 두는 방법과 2x1타일 뒤에 (ㅁ, 二) 이 오는 두 가지이다. 주의) 여기서 1 이 모양이 왜 못오냐면 앞의 경우와 무조건 겹칠 수밖에 없다. 예를들어 - 111, 二1, ㅁ1 이 모든 경우를 2x2타일을 구할 때에 사용한다. 2x2타일을 채울 때에 1을 마지막에 썼기 때문에 모든 경우의 수를 사용한 것이다. 4. 즉 dp[i] = dp[i-1](앞의..

알고리즘 공부 2021.09.13

[백준 10844번] 쉬운 계단 수- java

문제 설명 1. 계단 수란, 인접한 수의 차이가 1인 수이다. - 맨 앞이 0이되면 안됨. 2. 자릿수가 1이면 1,2,3,4,5,6,7,8,9 / 자릿수가 2이면 10,21,12,32,23,43,34,54,45,65,56,76,67,87,78,98,89 ..... 3. 정답을 1000000000으로 나눈 나머지를 출력하면 된다. 풀이 과정 1. DP로 문제를 풀었다( bottom-up으로 풀었음) 2. 저기 문제 설명에서 자리수가 2이면에서 적어놓은 숫자들을 보면 왜 저렇게 적어 놓았는지 알 수 있을 것이다. 3. 뒷자리 숫자가 0,1,2,3,4,5,6,7,8,9 이 순서대로 가면서 진행되고, 앞의 숫자들에서 법칙이 보일 것이다. 4. 맨뒷자리 앞자리 0 1 1 0, 1 2 1, 3 ..... 호롤로 ..

알고리즘 공부 2021.09.12

[백준 14502번] 연구소- java

문제 설명 1. 연구소의 크기 NxM , 바이러스 2, 벽 1, 빈칸 0을 입력받는다. 2. 바이러스는 위아래양옆으로 퍼지고, 벽으로 막혀있으면 더 퍼지지 않는다. 3. 우리는 벽을 꼭 3개를 세워야 한다. 3. 바이러스가 모두 퍼진 후, 남은 빈칸의 최대 갯수를 츨력하면 된다. 풀이 과정 1. 더 효율적인 방법을 찾고 싶었지만, 결국 매우 비효율적인 방법으로 풀게 되었다. 2. 완전탐색과 BFS를 동시에 사용하였다. 3. 먼저 벽을 3개를 세우는 모든 방법을 구하고, 3개가 세워졌으면 BFS를 진행하면 된다. 4. 그리고 BFS가 끝날 때 마다 최대 크기를 구하면 된다. 코드 import java.util.*; public class Main { public static int xMove[] = {-1..

알고리즘 공부 2021.09.09

java배열 다중 정렬하기

2차원 배열의 정렬의 경우 int arr[] = {{1,1}, {1,4}, {3,4}, {1,2}}; 이렇게 되어있는 배열 arr을 [1,1][1,2][1,4][3,4] 이렇게 배열하려면 Arrays.sort(arr, (o1, o2) -> { if(o1[0] == o2[0]){ return Integer.compare(o2[1], o1[1]); }else{ return Integer.compare(o2[0], o1[0]); } }); 이런 식으로 해 주면 된다. 그러면 만약에 2번, 3번, 4번....이렇게 더 비교하려면 어떻게 할까? Arrays.sort(arr, (o1, o2) -> { if(o1[0] == o2[0]){ if(o1[1]==o2[1]{ return Integer.compare(o2[2..

이론 정리/java 2021.09.06