자바 97

[백준 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

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

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

문제 설명 1. 복서의 몸무게, 전적이 주어진다. 2. W(이김), L(짐), N(경기안함) 이고, 경기를 안하면 체크하지 않는다. 3. 승률 - 자기보다 무거운사람을 이긴 횟수 - 자기 몸무게 의 순서로 동률이면 뒤의 것을 고려하여 rank를 return하면 된다. 풀이 과정 1. 이것도 정렬을 사용하면 매우 간단한 문제이다...사실 시간복잡도에서 걸릴 것 같았는데 어째 통과가 되었다. 2. 전체경기수, 이긴수를 구하서 승률 / 자기보다 무거운 사람 이긴 수 / 자기 몸무게를 배열에 저장한다. 3. compare의 로직을 이용하여 간단하게 순서대로 정렬하면 구해진다. 4. 노드별 compare구현하기~ 코드 import java.util.*; class Solution { public int[] sol..

[백준 1912번] 연속합 - java

문제 설명 1. N개의 숫자를 입력받는다. 2. 숫자들의 합을 구해서 최소숫자를 return하면 된다. 3. 최소 1000 최대 1000까지 간다. 풀이 과정 1. DP를 통해 쉽게 구할 수 있다. 2. 계속 숫자가 커지도록 만들기만 하면 부분합들을 구할 수 있다. 3. DP배열에 현재 숫자를 더했을 때 만들어지는 최대 합을 구하면 된다. 그 방법은 이전 숫자가 양수이면 그곳에 지금수를 더하고, 음수면 0에다가 더하면 된다. ex) 2, 3, -6, 3, -2, 4가 주어지는 경우의 합은 -> 2, (2+3), (2+3-6), 3, (3-2), (3-2+4) 앞의 숫자가 0보다 작으면 없애고 그보다 크면 쓰면 된다. 4. 구해진 합들 중 최대값을 return하면 된다. 코드 mport java.util...

알고리즘 공부 2021.09.03