차곡차곡 성 쌓기
article thumbnail
[백준] 4와 7 : 2877: 구현, 이진 수 - Java
알고리즘/백준 2025. 3. 21. 15:03

1. 문제  요약4와 7을 이용해서 K 번째 작은 수 만들기  2. 접근작은 수를 차례로 써보면  4,7,44,47,77,444,447,474...이다. 숫자만 다를 뿐 두 개의 수로 표현한다는 점에서 이진수를 표현하는 방법과 유사하다.k번째로 작은 수0과 1로 표기4 071440047017711444000447001474010 이 방법까지 떠올리면 반은 온거다. 하지만 이진 수랑 다른 점이 있다. 바로 맨 앞 bit에 0이 온다는 것이다. 최대한 이진수랑 연관시켜서 방법을 찾아야 한다. 이진수를 쭉 써보자 k번째로 작은 수0과 1로 표기이진수401711044001147011007711101444000110447001111 규칙이 있다. 잘 보면 k번째 작은 수는 k+1를 이진 수로 표현한 것에서 맨 앞..

[프로그래머스] level2 - 짝지어 제거하기

1. 문제짝지어 제거하기는, 알파벳 소문자로 이루어진 문자열을 가지고 시작합니다. 먼저 문자열에서 같은 알파벳이 2개 붙어 있는 짝을 찾습니다. 그다음, 그 둘을 제거한 뒤, 앞뒤로 문자열을 이어 붙입니다. 이 과정을 반복해서 문자열을 모두 제거한다면 짝지어 제거하기가 종료됩니다. 문자열 S가 주어졌을 때, 짝지어 제거하기를 성공적으로 수행할 수 있는지 반환하는 함수를 완성해 주세요. 성공적으로 수행할 수 있으면 1을, 아닐 경우 0을 리턴해주면 됩니다. 예를 들어, 문자열 S = baabaa 라면b aa baa → bb aa → aa →의 순서로 문자열을 모두 제거할 수 있으므로 1을 반환합니다.   2. 코드import java.util.*;class Solution{ public int sol..

article thumbnail
[백준] 카드섞기 : 21315 - 완탐 (Java)
알고리즘/백준 2025. 3. 8. 15:38

1. 문제https://www.acmicpc.net/problem/21315 요약카드를 2번 섞은 후에 결과를 줄테니, 각 2번의 k 값을 구해라  2. 접근독해력이 안좋아서 문제 이해하기가 어려웠다. 아무튼 k의 값을 구하는 건데, 문제의 조건을 보면3 ≤ N ≤ 1,0001≤ K, 2K 로 k는 1~9의 값을 가질 것이다. 그리고 두 번만 수행하면 되니 최대 많아야 9*9 = 81번이니 완탐으로 접근한다. 최종 결과를 보고 처음 결과로 돌아가기(x)처음엔 입력으로 주어진 결과를 이용하여 연산을 거꾸로 해서 초기값을 찾고자 했다. 하지만 좋은 방법이 아니였다. 연산이 더 복잡해지고 생각할 것이 많아진다. 처음상태를 가지고 최종 결과와 비교하기(o)그래서 초기 값이 {1, 2, 3..., N} 순서로 주..

article thumbnail
[백준] 링크와 스타트 - 백트래킹
알고리즘/백준 2025. 3. 7. 23:37

1. 문제https://www.acmicpc.net/problem/15661  2. 접근2개의 팀을 나누어서 전체 인원을 뽑는다.스타트 팀에서 N-1명을 뽑았으면, 링크 팀에서는 1명을스타트 팀에서 N-2명을 뽑았으면, 링크 팀에서는 2명을...스타트 팀에서1명을 뽑았으면, 링크 팀에서는 N-1명을 엇 근데 경우의 수가 너무 많은 것 같네. 이 방법이 아닌가 보다. 뭐지??? 도저히 모르겠다. 포기 접근은 맞았다. 근데 내가 경우의 수가 너무 많다고 생각한 이유는 한 팀을 결정 해놓은 상태에서 다른 팀을 구해야 하는 줄 알아서 AND 연산으로 착각을 했다. 또한 뽑은 인원을 관리할 방법이 생각이 안났다. 하지만 이 문제는 그렇게 푸는 것이 아니었다. 왜냐하면 한 팀에서 인원을 결정하면 자동으로 다른 팀 ..

article thumbnail
[백준] 타일 채우기 2133 - DP
알고리즘/백준 2025. 2. 11. 18:57

1. 문제  2. 접근우선 그려봤다. N이 2일 때, 4일 때, 6일 때그려보니 4일 때 새로운 경우가 2가지 나오는 것을 알았다. 이것을 제외하면 dp[i-2]*3을 해주면 되는데, 새로운 경우를 어떻게 처리할지 몰랐다.  근데 N이 4일 때 말고도 6, 8... 이 될 때마다 새로운 경우가 아래 처럼 2가지 추가됐다.이 경우를 따로 구해줘야 한다.dp[0] = 1;dp[2] = 3;for(int i=4; i=0; j-=2){ dp[i] += dp[j]*2; }} 만약 내가 구하는 것이 dp[6]이라할 때, 우선 dp[4]에서 3을 곱한다. 왜 3을 곱하냐면 dp[2]가(3x2), 즉 3x2를 구성하는 경우의 수가 3이기 때문이다. 그래서 3x4를 이루는 블록에 3x2 블록을 붙여주는..