자바 104

[백준 12100번] 2048(easy) - java

문제 설명 1. N개의 크기가 정해진 보드가 주어진다. 2. 보드에 2~ 1024의 크기 내의 숫자들이 주어진다. 3. 숫자들은 위로, 아래로, 왼쪽으로, 오른쪽으로 딱 붙여서 정리할 수 있으며, 위로 이동하는 경우 이전의 숫자와 이후의 숫자가 같으면 두 숫자는 합쳐진다( 8에 8이 이동하면 16하나가 되는 느낌이다.) 4. 5번의 이동이 있은 후 가능한 최대 숫자를 return하면 된다. 풀이 과정 1. 엄청나게 코드를 더럽게 풀었다. 모든 경우를 하나하나 만들었음... 2. 재귀함수 문제이다. 적절한 범위를 지정해 주면 된다. 3. 간단하게 코드에 대해 설명하자면 - 위, 아래, 오른, 왼 코드를 하나씩 만들어서 모든 경우를 탐색한다 (위 - 위 - 위 - 위 - 위), (위, 위, 위, 위, 아래)..

알고리즘 공부 2021.10.16

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

문제 설명 1. 좌표평면상의 선분들이 주어진다. 2. 선분들이 만나는 좌표들의 정수값들만 고려한다. 3. 만나는 곳은 * 나머지는 . 으로 이루어진 최소 크기의 도형을 RETURN하면 된다. 풀이 과정 1. 이게 왜 level2문제일까....? 생각보다 난이도가 높았다. 차근차근 하나씩 구해주자. 이거 클래스 써서 하려 했더니 코드가 진짜 말도안되게 더러워져서 절차적으로 풀었다. ( 교점 구하기 ) 2. 먼저 선들이 만나는 점을 구한다. 고등학교 때에 배운 일차함수 방정식을 쓰면 된다.

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

문제 설명 1. n개의 송전탑은 트리 형태로 이어져있다. 2. 무조건 트리 형태이며, 중간에 한 칸을 끊어 두 개의 네트워크로 분할한다. 3. 두 네트워크 간의 차이의 절대값의 최소값을 return하면 된다. 풀이 과정 1. 간단한 문제이지만 효율적인 방법으로 풀기는 생각보다 힘들다..... 2. 먼저 모든 전선을 연결시킨다. 3. 그리고 각각의 경우에서 자신의 경우 / 자식의 경우를 나누어, DFS를 해 준다. 4. 모든 경우를 구하면서 연결을 끊은 경우를 구했으면, 그 연결을 해제하고, 다른 곳에서는 해당 연결을 다시 구하지 않을 것이다. 5. 그 경우들에 대해 최소의 절대값을 구하면 답을 return할 수 있다. 코드

[백준 1100번] 하얀 칸 - java

문제 설명 1. 8*8 크기 배열이 주어진다. 2. '.'은 말이 없는 상태, 'F'은 말이 놓여진 상태이다. 3. 흰색 말은 0,0 0,2 0,4 ...이런식으로 주어질 때 흰색 말의 개수를 return하면 된다. 풀이 과정 1. 간단한 문제인데, 더 쉽게 풀 수 있다. 배열도 필요없다. 2. 0,0 0,2 0,4 0,6 1,1 1,3 1,5 .... 이렇게 주어지는거면 흰색 말은 x축 y축의 합이 짝수인 곳마다 주어진다. 3. 배열을 받으면서 그 배열이 짝수가 되는 곳의 말을 판별하면 된다. 코드 알고리즘 풀이의 비중을 낮추고 자바 웹 개발 기초를 더 공부하기로 했음..이번주는 백신을 맞아서 조금 쉬어가기로 했다.

알고리즘 공부 2021.10.05

[백준 1764번] 듣보잡 - java

문제 설명 1. N, M이 주어진다. 2. N개는 들어보지 못한 사람, M개는 보지 못한 사람이다. 3. 두 가지 모두의 경우에 해당하는 사람을 구하면 된다. 풀이 과정 1. 기초적인 HashMap문제이다. 여기서는 HashSet으로 풀면 됨. 2. N개의 배열에 대해 각각을 HashSet으로 받아준다. 3. 그 HashSet에 대해 존재하는 M개의 배열들을 ArrayLIst에 저장한다. 4. 그 ArrayList를 배열을 바꾸고 출력시키면 된다. 코드

알고리즘 공부 2021.10.04

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

문제 설명 1. 명함의 가로, 세로 크기가 주어진다. 2. 명함을 담을 수 있는 가장 작은 크기의 명함지갑의 크기를 return하면 된다. 3. 명함은 눕혀서 보관할 수도 있고, 세워서 보관할 수도 있다(가로세로 위치 상관x) 풀이 과정 1. 굉장히 간단한 문제이다. 2. 명함의 가로, 세로 기준으로 긴 값과 짧은 값들을 저장한다. 3. 긴 값들의 최대값, 짧은 값들의 최대값을 곱하면 답을 구할 수 있다. 4. 여기서 구현한 코드는 process별로 나누어서 길게 나왔지만, 실제로는 짧은값 긴값 두개를 만들어서 이를 바로바로 구하면 for문을 한 번만 사용해서도 충분히 구할 수 있을 것이다. 코드 코드2

[백준 12015번] 가장 긴 증가하는 부분 수열2 - java

문제 설명 1. N이 주어진다. 2. N개의 배열들에 해당하는 숫자들이 각각 주어진다. 3. 가장 긴 증가하는 부분 수열을 구하면 된다. 풀이 과정 1. 처음에는 DP로 풀려 하였는데, 시간 복잡도에서 문제가 발생했다. 이후 DP와 이분탐색을 섞어서 해결하였다. 2. 부분 수열을 저장할 Arraylist를 만들어, 이를 채워 준다.(이걸 쓴 이유는, 부분 수열의 경우 언제까지 값이 있을지 모르기도 하고, 중간에 값을 바꾸려고 하기 때문이다.) 3. 숫자를 순서대로 입력받으며, 현재 입력된 순서의 숫자가 Arraylist의 가장 위의 값보다 큰 값인지 확인한다. 4. 이후, 그 값이 더 큰 값인 경우 배열을 추가해 주면 된다. 4. 그렇지 않은 경우 배열 내부의 값들 중 해당 값보다 큰 수들 중 최소의 숫..

알고리즘 공부 2021.09.26

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