티스토리챌린지 19

99클럽 코테 스터디 31일차 TIL DP(줄세우기)

https://www.acmicpc.net/source/86922116 알고리즘의 난이도가 올라가면 더 이상 알고리즘 난이도의 문제가 아닌 아이디어의 문제임을 알려주는 대표적인 유형의 문제. 별의별 생각을 다 해보며 규칙을 찾아봤는데 결국은 하나였다. 오름차순으로 만들어야 한다는 것.오름차순으로 만들기 위해 옮겨지는 아이의 최소 수는? 이미 오름차순인 번호를 제외하고, 나머지 번호를 옮겨주면 된다.즉, (총 학생 수 - 가장 긴 증가하는 부분 수열) 인 것이다~!가장 긴 증가하는 부분 수열은 이전에 넘 많이 글을 올렸어서 링크로 첨부하겠당.https://dev-zsunny.tistory.com/65 99클럽 코테 스터디 30일차 TIL DP(상자넣기)https://www.acmicpc.net/proble..

코테/백준 2024.11.27

99클럽 코테 스터디 30일차 TIL DP(상자넣기)

https://www.acmicpc.net/problem/1965문제 읽으면서 든 생각. 어라..? 이거 그냥 가장 긴 증가하는 부분수열 아닝가..?https://www.acmicpc.net/problem/11053 (백준 11053 가장 긴 증가하는 부분 수열) 크기가 더 큰 상자에 크기가 더 작은 상자를 넣을 수 있고, 이렇게 넣을 수 있는 최대 상자의 개수를 구하는 문제.결국은 오름차순을 가지는 수열의 개수를 구하면 되는 문제이다.예제를 살펴보면 1 6 2 5 7 3 5 6 -> 1, 2, 3, 5, 6 으로 총 5개가 답이 된다.순차적으로 배열을 탐색하며 현재 값보다 인덱스가 작은(이전에 위치한) 값들을 보며 현재 값보다 작으면 해당 인덱스 dp에 + 1 씩 하며 최댓값을 갱신해준다.  packa..

코테/백준 2024.11.26

99클럽 코테 스터디 29일차 TIL DP(파도반 수열)

https://www.acmicpc.net/problem/9461 처음에 이해가 잘 안돼서 P(N)을 쭉 써보다가 규칙을 찾았다. P(1) = 1,P(2) = 1,P(3) = 2,P(4) = 2,P(5) = 2,P(6) = P(3) + P(5) = 3,P(7) = P(2) + P(6) = 4,P(8) = P(1) + P(7) = 5,P(9) = P(4) + P(8) = 7,P(10) = P(5) + P(9) = 9,P(11) = P(6) + P(10) = 12,P(12) = P(7) + P(11) = 16 작성하다보니 슬슬 규칙이 보이기 시작했다.혹시 몰라서 문제의 그림을 보며 머릿속으로 그려봤는데 한바퀴를 돌 때까지 규칙이 일정하다는 것을 확인했다.P(1) ~ P(8) 이후부터는 P(N) = P(N-5..

코테/백준 2024.11.25

99클럽 코테 스터디 28일차 TIL DP(가장 큰 증가하는 부분 수열)

https://www.acmicpc.net/problem/11055 어제와 비슷한 유형의 문제이다.문제에서 구해야 하는 값을 dp배열에 저장하는 값으로 설정하고, 그 규칙을 하나씩 찾아봤다.dp[0] 은 무조건 배열의 값일것이고, 그 뒤는 현재 값의 앞에 있는 값들을 탐색하면서 현재 값보다 작은 값이 있으면 그 값에 현재 값을 더한다.그리고 이런 값들을 Math.max를 통해 최댓값으로 갱신하며 구하면 끝!(자세한 건 아래 주석 참고)** 참 저 ans 때문에 98%에서 또 틀렸는데, ans를 자꾸 습관적으로 0으로 초기화해서 1 1을 넣었을 때 0이 나왔다(반목문 안돌아서)ans 초기화도 생각을 잘 해서 초기화하자.. 여기선 dp[0]으로.. package Study.Week04;/*1 : dp[0] ..

코테/백준 2024.11.24

99클럽 코테 스터디 27일차 TIL DP(가장 긴 감소하는 부분 수열)

https://www.acmicpc.net/problem/11722 1시간 동안 고민했는데 도오저히 아이디어가 안 떠올라서 힌트를 봤다 >.순서대로 탐색하면서 현재 값보다 이전 값의 크기를 비교하며 수열의 길이를 메모이제이션 하면 된다.현재 값보다 이전 값이 클 때 그 이전 값에 + 1을 수열의 크기로 저장하면서 갱신해주면 된다.자세히 분석해보면 아래와 같다.10 30 10 20 20 1010 : dp[0] = 110, 30 => 10 or 30 : dp[1] = 110, 30, 10 => 30, 10 : dp[2] = dp[1] + 110, 30, 10, 20 => 30, 20 : dp[3] = dp[1] + 110, 30, 10, 20, 20 => 30, 20 : dp[4] = dp[1] + 110,..

코테/백준 2024.11.23

[BOJ] 2615 오목 (Java)

https://www.acmicpc.net/problem/2615 처음에 문제 읽고 설계했던 방식은 다음과 같다.1. 모든 바둑돌의 좌표를 구조체를 만들어 바둑돌 색상과 함께 큐에 저장한다.2. 하나씩 꺼내면서 dfs로 8방 탐색을 한다.3. 범위를 벗어나거나 방문했거나 다른 바둑돌 색상을 만나지 않고, 같은 바둑돌 색이면 cnt+1을 한다.4. 범위를 벗어나거나 방문했거나 다른 바둑돌 색상을 만나면 cnt를 확인해서 5이면 그 때의 시작 좌표를 출력한다.하지만 2-3%에서 틀렸고, 좌표를 찍어보며 수정하는 과정에서 엄청나게 많은 허점이 있음을 깨달았다. 1번 허점)그냥 큐에 저장하면 안됐다. 처음엔 위에서 아래로 배열을 탐색하기 때문에 조건을 만족한다고 생각했는데,반례를 보면서 만약 바둑돌이 왼쪽 아래..

코테/백준 2024.11.22

99클럽 코테 스터디 25일차 TIL 완전탐색(주사위 쌓기)

https://www.acmicpc.net/problem/2116 이 문제는 처음에 아이디어 설계하는 게 젤 힘들었다.이렇게 하는 게 맞나..? 하면서 풀긴 했는데 주사위 개수 범위가 작아서 완탐으로 가능했던 것 같다.아이디어를 정리해보면1. 1번 주사위의 모든 면을 바닥으로 두고 각각의 경우를 계산 시작한다.2. 0-5, 1-3, 2-4 면이 각각 마주보는 면이라는 것을 이용하여 현재 바닥의 윗면을 찾는다.3. 이렇게 찾은 바닥과 윗면을 제외한 모든 수를 열의 크기가 4인 map 배열에 넣어준다.4. 이때, 현재 윗면이 다음 주사위의 바닥이 될 것이므로, 다음 주사위의 바닥을 새롭게 찾아주어야 한다(nBottom)5. 이런식으로 계속 바닥면과 윗면을 찾아서 각각의 옆면이 될 수 있는 모든 수를 map에..

코테/백준 2024.11.21

99클럽 코테 스터디 23일차 TIL 완전탐색(소수찾기)

https://school.programmers.co.kr/learn/courses/30/lessons/42839 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 주어진 수를 가지고 만들 수 있는 모든 자릿수의 소수를 구하는 문제이다.모든 자릿수를 구하기위해 부분집합을 사용했고,이 자릿수로 만들 수 있는 모든 순서를 구하기위해 순열을 사용했다.그리고 각각의 수를 소수판별을 해서 소수는 set에 넣어주고, 마지막엔 set의 사이즈를 리턴했다. (중복 제거 위해) 그리고 제출했으나, 2/10/11/12번 테케가 틀렸다.이유는 소수 판별을 할 때 Math.sqrt(num) 범위까지의 수로만 판별해서 121과 ..

99클럽 코테 스터디 22일차 TIL 완전탐색(피로도)

https://school.programmers.co.kr/learn/courses/30/lessons/87946 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 현재 피로도로 탐험할 수 있는 최대 던전 수를 구하는 문제.어떤 '순서'로 탐험하느냐에 따라 최대 던전 수가 달라진다. 범위가 크지 않은 것을 참고하여 순열로 구현했다.1. 탐험할 던전의 순서를 순열로 정한다.2. 현재 던전 순서에 따라 탐험 가능한 던전 수(cnt)를 구하고, 이때 마다 최댓값(answer)으로 갱신한다.3. 모든 경우를 구하고 정해진 최댓값을 반환한다. import java.util.*;class Solution { ..

99클럽 코테 스터디 21일차 TIL 완전탐색(카펫)

https://school.programmers.co.kr/learn/courses/30/lessons/42842 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 그냥 수학처럼 풀었다,,1) x >= y2) x + y = (brown / 2) + 2;3) xy = brown + yellow이 3가지 조건을 만족하는 값을 배열에 저장하면 된다! class Solution { public int[] solution(int brown, int yellow) { int[] answer = new int[2]; for(int x=brown; x>=0; x--){ ..