< '분류 전체보기' 카테고리의 글 목록 (4 Page)

전체글 179

[C++ / 백준 2225번] 합분해

음... 초반 경우의 수를 찾아 규칙을 통해 점화식을 세웠는데, 점화식은 세워서 정답을 맞췄지만 왜 그 점화식이 도출되는지는 모르는 사태가 발생했다.    따라서 GPT 에게 도움을 요청했다. 경우의 수는 두 가지로 나눌 수 있었는데,dp[i-1][j]: 숫자 i-1을 j개의 숫자로 표현한 후, 마지막 숫자에 1을 더하는 경우.dp[i][j-1]: 숫자 i를 j-1개의 숫자 합으로 표현한 후, 마지막 숫자에 1을 더하는 경우.이렇다고 한다. i = 3, j = 2 일때를 예시로 들자. dp[2][2] = (02 20 11)  = 3dp[3][1] = (3) = 1dp[3][2] = (03 30 12 21 ) = 4 인데  dp[2][2]  에 i를 1 늘리는 경우 1 + 22 + 10 + 3 이고. dp..

[C++ / 백준 1912번] 연속합

DP를 이용하여 풀이했다. 범위가 100,000 이고 시간 제한이 1초이므로 이중 for문을 사용할 수 없다.따라서 카데인 알고리즘을 활용해 풀이했다.배열 하나씩 더해가면서 DP 배열을 구하되  ans 변수를 이용해 최대 값이 나온 dp 배열 인덱스의 값을 동시에 찾도록 했다.그리고 0번째 인덱스 값 혼자가 최대값일 때를 대비해 for문에 들어가지 않는 0번 인덱스를 ans 와 다시 한번 비교해 주었다. 주의할 점은 dp 배열은 (해당 인덱스 - 1 ) + a[해당 인덱스] 값과 a[해당 인덱스] 값 중 누가 큰지를 저장하는 역할이고(0부터 해당 인덱스까지의 원소를 합했을 때의 최대 값) , 실제 답은 ans 에 저장된다는 것이다.  #include #include #include using namesp..

[C++ / 백준 11053번] 가장 긴 증가하는 부분 수열

시간 제한이 1초이고, 수열의 크기가 1000이므로 1000 * 1000을 하였을 때 1억 번을 넘지 않아 이중 반복문으로 풀이 할 것을 예상했다. DP 문제들이 대부분 배열과 점화식을 사용해 해결하다보니 자연스럽게 C 배열로 선언해서 풀었었는데, 다른 풀이를 검색해서 보니 벡터를 사용하는 것이 훨씬 깔끔해 바꾸었다. 핵심은 이중 반복문으로 경우의 수를 전부 순회하며 가장 긴 수열을 만드는 DP 배열 값을 찾는 것이다. 우선 현재 인덱스 i 가 이전 인덱스들의 수보다 당연히 커야 하며, 이전 인덱스의 수보다 i 인덱스 수가 크다면 그때 dp 배열을 검사해  max ( i번째 값, dp[j] + i번째 값) 을 실행해 갱신해 주면 된다. #include #include #include using names..

[C++/백준 1212번] -2진수

대략 황당했던 문제. 처음에 보고 이걸 어떻게 풀어야 하나 생각했다. 진법에 맞게 -2 로 나누되, 컴파일러의 양수 / 음수 , 음수 / 양수 나눗셈에 대한 이해를 요하는 문제였다.  C/ C++ 컴파일러에서는  13 / -2  가 -6 이 나오고, 파이썬에서는 13 / -2 가 -7 이 나온다고 알려져 있다. 이는 컴파일러의 계산 차이에서 오는 것인데, 우리가 -2로 나눌 때 나머지가 음수가 나오면 진법에 적용을 할 수 없으므로 13 / -2 는 (-2) * ( -6)  + 1 으로 나타내야 한다. 예시인 -13 을 예시로 들어보자. -13 / -2 -> (-2) * 7  + 17 / -2   ->  (-2) * (-3) + 1-3  / -2 -> (-2) * (2) + 12  /-2 ->  (-2) ..