자바 104

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

[프로그래머스] N으로 표현 - java

문제 설명 1. 숫자 N과 number이 주어진다. 2. number을 N을 사용해서 만들 수 있는 경우가 여러 가지 있는데, 이 중 최소횟수를 구한다. 3. 8회 초과이면 -1을 return한다. 풀이 과정 1. DP문제인데 나는 DFS랑 최적해를 섞어서 푼것같다.... DP만으로 푸는 방법은 모르겠음...... 2. N을 통해 +-/*를 해서 구할 수 있는 모든 방법을 구한다. 3. 위의 process를 전체 문자열의 길이만큼 진행하면 구할 수 있다. 4. 그리고 N뿐만 아니라 NN NNN 이런것도 가능하다. 참고로 이경우 count는 당연히 하나 늘어날 것이다. 5. 마지막으로 중요한게 8회 초과이면 -1을 리턴하도록 만들면 된다. tip ) 그리고 시간복잡도를 조금이나마 줄이는 방법인데, 어차피 ..

알고리즘 공부 2021.09.02

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

문제 설명 1. 'A' 'E' 'I' 'O' 'I' 다섯글자로 단어를 만들수 있다. 2. 단어 길이는 5개 이하이며, A AA AAA AAAA AAAAA AAAAE ... 이런 순서로 진행된다. 3. 단어가 주어지면, 이게 몇번째 단어인지 return하면 된다. 풀이 과정 1. 문제의 테스트 케이스를 보면 알겠지만, 문자들에 대해 완전탐색을 하나하나 진행하면 절대 안될것이다...안해봤지만 그럴것같음. 2. A로 시작하면 A, AA ..... E로 시작하면 E, EA ....... 이렇게 진행되는데, 이를 통해 수식을 통해 구할 수 있다고 유추 가능하다. 3. A는 1이고, I는 1563인데 이를 통해 E는 782이고 각각 시작하는 문자를 기준으로 781의 간격이 떨어져 있다. 4. A,E,I,O,U 5글..

[프로그래머스] 정수 삼각형 - java

문제 설명 1. 삼각형이 주어진다. 2. 맨 아래까지 삼각형을 하나씩 더해가면서 그 최대값을 구한다. 3. 맨 아래줄에서 최대값을 구해주면 된다. 풀이 과정 1. 간단한 DP 문제이다....이게 왜 level3일까?? 2. 각 삼각형 위치에서 가장 큰 합을 구하는 배열을 만들어 준다. 3. 맨 왼쪽은 무조건 다 왼쪽으로 이동해야 하므로 0, 0부분은 싹다 현재 삼각형 크기와 위의 크기를 더해주면 된다. 7 - 3 - 8 - 2 - 4 (이렇게 왼쪽으로 가는거는 쭉쭉 더해주면 될것이다. 다른 방법은 없다.) 4. n번째 위치의 최대값은 그보다 윗 칸의 왼쪽에 있는 값, 오른쪽에 있는 값중 큰거를 구하면 된다. 5. 이제 맨 아래 위치의 값들 중 최대값을 return하면 된다. 코드 class Solutio..

알고리즘 공부 2021.08.26