DP 16

[백준/파이썬] 1082: 방 번호

문제 보러 가기 DP로 풀었다 !! 특정 숫자의 가격은 딕셔너리에 저장해뒀다. (그런데 생각해보니 어차피 0~ N-1 순서니까 그냥 리스트에 가격을 저장했어도 될 것 같다.) dp 리스트의 인덱스는 돈, 값은 그 돈으로 살 수 있는 제일 큰 방 번호를 의미한다. 각 값은 '-'으로 초기화해뒀다. 처음에는 0으로 했는데, 그러면 숫자 0을 살 수 있다는 뜻인지, 아무것도 못 산다(or 안 샀다)는 뜻인지 구분이 안가서 '-'으로 했다. 그 후에 dp 세팅을 했다. 각 숫자를 하나 사는 경우를 dp에 넣어줬다. dp[그 숫자의 가격] = 그 숫자 로 해줬다. 그 다음에는 본격적인 DP! 숫자 가격이 젤 작은 것 X 2부터 M까지 쭉 ~ 보는데, 그 지점에서 각 숫자 가격을 뺀 위치의 값과 비교했다. 다시 말..

[백준-파이썬] 5535: 패셔니스타

재밌는 DP 문제였다!! https://www.acmicpc.net/problem/5535 날짜 별로 입을 수 있는 옷을 딕셔너리에 저장했다. 매일 날짜 별 온도를 쭉~ 보면서, 옷들도 쭉~ 보면서 그 날 그 옷을 입을 수 있는지 봐줬다. 위 정보를 활용해서 DP를 진행했다.(아래 그림 참고) 날짜 별로 쭉 ~ 보면서, 그날 입을 수 있는 옷들을 쭉~ 보는데, 그 전날 입을 수 있는 옷들을 쭉~ 봐줬다. 그러면서 dp[당일][당일 입을 수 있는 옷의 인덱스] = max(dp[당일][당일 입을 수 있는 옷의 인덱스], dp[전날][전날 입을 수 있는 옷의 인덱스] + abs(당일 입을 수 있는 옷의 화려함 - 전날 입을 수 있는 옷의 화려함))를 해주었다. 헷갈렸던 부분 👨🗝 첫날 말고 둘째날부터 시작한다..

[백준-파이썬] 14550: 마리오 파티

문제 보러 가기! DP문제 !! 입력이 특이한 것 같다..- 여러 줄에 걸쳐서 N개의 정수가 주어지는 부분, 테스트케이스가 몇 개인지 안 알려주고 맨 끝에 0이 오는 부분. try, except를 이용해서 편하게 테스트케이스 수만큼 동작하게 했다. 여러 줄에 걸쳐서 N개 정수가 주어지는 부분을 위해서, 리스트로 받고 개수를 세다가 N개가 되면 그만 받게 했다. dp table을 2차원으로 만들었다. 세로: 몇 번째 이동한 것인지 가로: 해당 위치 값: 최대로 얻는 수익!! (예- 1번째로 이동해서 1번째 칸에 도달했을 때 얻는 최대 수익) 세로 첫 줄은 채우고 시작한다. (1~S만큼 이동할 수 있으니까 그만큼만 채우기) 그 다음 세로 줄들을 돌면서, 가로를 채운다. 이런 식으로 된다..! 그 가로까지 올..

[백준-파이썬] 9465: 스티커

문제 보러 가기! 문제 2행 n열에 한 칸마다 스티커가 있다. 각각에는 점수가 있다. 한 스티커를 쓰면, 그것과 변을 공유하는(상하좌우) 스티커를 못 쓴다. 쓸 수 있는 스터커 점수의 최댓값을 구하는 문제였다. 풀이 DP로 풀었다. dp 테이블을 2Xn 리스트로 만들었다. 그 위치의 스티커를 뗐을 때, 그때까지의 최대 점수를 저장한다. 1행 n열의 스티커 뗐을 때의 최대 점수 = (2행 n-1열 스티커 뗐을 때의 최대 점수 or 2행 n-2열 스티커 뗐을 때의 최대 점수) + 1행 n열 스티커 점수이다. 2행 n열의 스티커 뗐을 때의 최대 점수는 위의 식에서 2행을 1행으로, 1행을 2행으로만 바꾸면 된다! n이 1일 때, 2일 때는 따로 수작업으로 처리했다. 하늘색 숫자는 그 자리의 스티커 떼면 얻는 ..

[백준-파이썬] 1932: 정수 삼각형

문제 보러 가기! 하늘색 숫자는 원래 그 자리의 숫자이다.(arr에 저장했다.) dp는 n X n 2차원 리스트로 만들었다. 세로는 위에서부터 몇 층 내려왔는지, 가로는 지금의 가로 위치를 뜻한다. 그 위치로 올 수 있는 숫자 중 큰 수(각 층에서 0번째 자리는 바로 위에서만 내려올 수만 있고, 가장 오른쪽 수는 대각선 왼쪽에서만 내려올 수 있다. 다른 수들은 바로 위 or 대각선 왼쪽 수 중 큰 수!! )에다가 원래 그 자리의 숫자를 더해서 저장했다. 아! 문제에 '아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.'라고 쓰여 있는데, 인덱스로 따지면..! 아래 그림처럼 된다. 노란 동그라미 친 숫자 기준으로 보면, 왼쪽 대각..

[백준-파이썬] 2240: 자두나무

문제로 가기! 몇 초에 몇 번 이동했을 때, 그때까지 먹은 자두 수를 dp 테이블에 저장했다.(2차원 리스트로 dp) 이 부분에 점화식 설명을 적을 것이다.. 그림으로 그려서 설명하려고 하는데, 지금 태블릿을 누구한테 빌려줘서... 내일 할게용 초가 지나갈 수록 자두가 몇번 나무에서 떨어지는지 쭉~ 보면서, 몇 번 나무에서 떨어졌는지에 따라서 다르게 했다. 1번 나무에서 자두 떨어졌을 때) 한 번도 이동 안했을 때 1번 나무에서 시작하니까, dp[0][j]가 전에 비해서 1 증가. 그 것보다 많이 이동했을 때는, 짝수번 이동했는지 홀수번 이동했는지에 따라서 몇 번 나무에 있는지 알 수 있다. 짝수번째로 이동했으면 1번 나무에 있는 것이다. 최대 이동 횟수일 때는 따로 처리한다. 2번 나무에서 자두 떨어졌..

[백준-파이썬] 17130: 토끼가 정보섬에 올라간 이유

문제 보러 가기! 문제를 읽어보니 토끼가 정보섬에 올라간 이유는! 당근을 많이 주워 가기 위해서였다 ! 🥕🥕 토끼는 →, ↘, ↗ 방향으로만 이동할 수 있다. 정문으로 들어와서 쪽문으로 나가는데, 쪽문은 여러 개이고 a 쪽문을 지나서 b 쪽문으로 나가도 상관없다. 토끼가 섬에 있을 동안 얻을 수 있는 당근의 최대 개수를 구하는 문제였다! (쪽문으로 빠져나갈 수 없는 경우에는 -1을 출력한다) ㅠㅠㅠ 많이 틀리다가 맞았따.. ㅠㅠㅠㅠ 일단은 토끼가 정문으로 들어오는 것은 'R'로 표시되기 때문에, 그 위치를 찾았다. 그 후에는 그쪽보다 오른쪽인 지점들을 다 쭉~ 봐주었다. 그러면서 해당 지점일 때까지 얻을 수 있는 당근의 최대 개수로 업데이트했다. (그 지점으로 올 수 있는 방법은 →, ↘,..

[백준-파이썬] 9844: Gecko

문제 풀러 가기! 주어진 예제 1을 풀이하면 아래 그림처럼 된다. ! dp - 모든 위치를 보면서 그 위치일 때 가장 큰 값을 저장했다. 일단 h가 0일 때는 tiles 값 그대로가 그 위치일 때 가장 큰 값이다. y좌표 1 이상이 될 때부터는.. 1) x좌표가 0이거나 w-1이면, y좌표가 현재 지점보다 1 적을 때 바로 위, 한쪽 대각선 중에(그림의 파란색 화살표들 참고) 큰 값을 택한다. 그 값과 tiles 자기 위치 값(그림에서 초록색 값)을 더한다. 2) x좌표가 1~ w-2라면, y좌표가 현재 지점보다 1적을 때 바로 위, 좌측 대각선 위, 우측 대각선 위 중(그림의 노란색 화살표 참고) 큰 값을 택한다. 그 값과 tiles 자기 위치 값(그림에서 초록색 값)을 더한다. y좌표가 h-1까지 오..

[백준-파이썬] 17404: RGB거리 2

문제로~ RGB거리 1을 풀고, RGB 거리 2도 있길래 스터디 문제에 넣었다. RGB 거리 1은 괜찮았는데,,, 이 문제는 좀 더 생각을 해야 한다. 달라진 거라고는 1번 집 색깔과 마지막 집 색깔이 달라야 한다는 것 뿐이다. 그런데 훨씬 어렵다..ㅠ 아이디어가 잘 안떠올랐다.. 1번 집의 색깔을 기억(?)하고 있어야 한다는 거니까, R, G, B 각각에서 출발해 보면 된다. 또 첫번째 집과 마지막 집 색깔이 달라야 하니까, 정답(ans)을 구할 때 마지막 집을 R, G, B로 색칠한 결과(첫번째~마지막 집 색칠한 최소 비용) 중 첫번째 집과 색깔이 같은 건 고려하지 않아야 한다. R, G, B 각각에서 출발하는 것을 구현하려면.. => 다른 곳의 값은 크게 두고, 해당 색깔으로 칠하는 경우만 그 때 ..

728x90