전체 글 263

로스트아크 97돌 깎기 (Python)

DP 알고리즘 문제를 풀다가, 문득 '로스트아크 세공도 DP로 확률을 구할 수 있지 않을까?' 싶어서 관련 내용을 찾아봤다. 그리고, https://www.inven.co.kr/board/lostark/4821/82409 등의 글을 참고해보니, 된다고 하더라. 그래서 스스로 아이디어를 짜서 코드를 짰다. (내가 아는 선에서) 기본적인 규칙 (개인적으로 로스트아크는 1시간 해본게 끝이다. 아님 말고) 3개의 어빌리티 스톤이 있으며, 2개는 성공하면 능력치 증가, 1개는 성공하면 능력치 감소이다. 어빌리티 스톤마다 10번의 시도 기회가 있다. 유저는 스톤1, 스톤2, 스톤3 중 하나를 선택하여 강화를 시도할 수 있다. 성공 확률은 처음에 75%이며, 성공할 때마다 10%p씩 감소하여 최저 25%까지 내려가며..

PS/DP 2021.10.03

백준 9009번: 피보나치 (Python)

문제 피보나치 수 ƒK는 ƒK = ƒK-1 + ƒK-2로 정의되며 초기값은 ƒ0 = 0과 ƒ1 = 1 이다. 양의 정수는 하나 혹은 그 이상의 서로 다른 피보나치 수들의 합으로 나타낼 수 있다는 사실은 잘 알려져 있다. 하나의 양의 정수에 대한 피보나치 수들의 합은 여러 가지 형태가 있다. 예를 들어 정수 100은 ƒ4 + ƒ6 + ƒ11 = 3 + 8 + 89 또는 ƒ1 + ƒ3 + ƒ6 + ƒ11 = 1 + 2 + 8 + 89, 또는 ƒ4 + ƒ6 + ƒ9 + ƒ10 = 3 + 8 + 34 + 55 등으로 나타낼 수 있다. 이 문제는 하나의 양의 정수를 최소 개수의 서로 다른 피보나치 수들의 합으로 나타내는 것이다. 하나의 양의 정수가 주어질 때, 피보나치 수들의 합이 주어진 정수와 같게 되는 최소 ..

PS/Math 2021.10.03

백준 2156번: 포도주 시식 (Python)

문제 효주는 포도주 시식회에 갔다. 그 곳에 갔더니, 테이블 위에 다양한 포도주가 들어있는 포도주 잔이 일렬로 놓여 있었다. 효주는 포도주 시식을 하려고 하는데, 여기에는 다음과 같은 두 가지 규칙이 있다. 포도주 잔을 선택하면 그 잔에 들어있는 포도주는 모두 마셔야 하고, 마신 후에는 원래 위치에 다시 놓아야 한다. 연속으로 놓여 있는 3잔을 모두 마실 수는 없다. 효주는 될 수 있는 대로 많은 양의 포도주를 맛보기 위해서 어떤 포도주 잔을 선택해야 할지 고민하고 있다. 1부터 n까지의 번호가 붙어 있는 n개의 포도주 잔이 순서대로 테이블 위에 놓여 있고, 각 포도주 잔에 들어있는 포도주의 양이 주어졌을 때, 효주를 도와 가장 많은 양의 포도주를 마실 수 있도록 하는 프로그램을 작성하시오. 예를 들어 ..

PS/DP 2021.10.02

백준 10844번: 쉬운 계단 수 (Python) TODO

문제 45656이란 수를 보자. 이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다. N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다. 입력 첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다. 출력 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. 풀이 1) 1자리 수인 경우: 인접한 수가 없으니, 모든 수에 대해 vacuously true이다. 9개(그냥 9개라 문제에서 제시했다고 생각해도 무방할 듯 하다.) 2) 2자리 수인 경우: 10, 21, ... , 98 and 21, 32, ... , 89 총 17개이다. 3) 3자리 이상인 경우 이제는 규칙을 발견해야 ..

PS/DP 2021.10.02

백준 1463번: 1로 만들기 (Python)

문제 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다. X가 3으로 나누어 떨어지면, 3으로 나눈다. X가 2로 나누어 떨어지면, 2로 나눈다. 1을 뺀다. 정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 입력 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. 출력 첫째 줄에 연산을 하는 횟수의 최솟값을 출력한다. 풀이 일단 재귀적으로 풀면 안 될거 같다. 10과 같은 숫자를 생각했을 때, 2로 나눌 수 있다고 해서 2로 나누는 거보다 -1을 하는 것이 1에 더 빨리 다가갈 수 있는 것이다. 따라서 200000이라는 숫자를 넣으면 1+f(199999)와 1+f(100000)의 최소값..

PS/DP 2021.10.02

백준 2579번: 계단 오르기 (Python)

문제 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점수를 얻게 된다. 예를 들어 와 같이 시작점에서부터 첫 번째, 두 번째, 네 번째, 여섯 번째 계단을 밟아 도착점에 도달하면 총 점수는 10 + 20 + 25 + 20 = 75점이 된다. 계단 오르는 데는 다음과 같은 규칙이 있다. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다. 마지막 도착 계단은 반드시 밟아야 한다. 따라서 첫 번째 계단을 ..

PS/DP 2021.10.02

백준 1932번: 정수 삼각형 (Python)

문제 위 그림은 크기가 5인 정수 삼각형의 한 모습이다. #그림 복사 잘 안 돼서 안 들고 옴. 사이트 참고. 맨 위층 7부터 시작해서 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라. 아래층에 있는 수는 현재 층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다. 삼각형의 크기는 1 이상 500 이하이다. 삼각형을 이루고 있는 각 수는 모두 정수이며, 범위는 0 이상 9999 이하이다. 입력 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. 출력 첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력한다. 내 풀이 ..

PS/DP 2021.10.02

백준 1149번: RGB거리 (Python)

문제 RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다. 집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자. 1번 집의 색은 2번 집의 색과 같지 않아야 한다. N번 집의 색은 N-1번 집의 색과 같지 않아야 한다. i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다. 입력 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 ..

PS/DP 2021.10.02

백준 1904번: 01타일 (Python)

문제 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이의 공부를 방해하기 위해 0이 쓰여진 낱장의 타일들을 붙여서 한 쌍으로 이루어진 00 타일들을 만들었다. 결국 현재 1 하나만으로 이루어진 타일 또는 0타일을 두 개 붙인 한 쌍의 00타일들만이 남게 되었다. 그러므로 지원이는 타일로 더 이상 크기가 N인 모든 2진 수열을 만들 수 없게 되었다. 예를 들어, N=1일 때 1만 만들 수 있고, N=2일 때는 00, 11을 만들 수 있다. (01, 10은 만들 수 없게 되었다.) 또한 N=4일 때는 0011, 0000, 1001, 1100, 1111 등 총 5개의 2..

PS/DP 2021.10.02

파이썬 사소한 팁

계속 추가해나갈 예정 2진수, 8진수, 16진수 표현 / 변환: hex(), int(string, 16), format https://www.daleseo.com/python-int-bases/ 아스키 코드 / ord(): string to ascii, chr(): ascii to string https://lsjsj92.tistory.com/201 리스트 내 each element에 여러 개의 인자가 있을 때, i번째 index 기준으로 내림차순/오름차순 정렬하는 식: a.sort(key=lambda x: x[i]) cf) a.sort(key=len): 리스트 내 원소의 길이를 기준으로 정렬함 a[::-1]: a를 reverse한 list a[1::-1]: a[0:1]을 reverse한 list a[:..

PS/etc 2021.10.02