2. 배열 값이 0이 아니면 바구니의 맨 위랑 인형의 종류를 비교 후, 같으면 답을 2만큼 증가시켜주고 바구니의 맨 위를 비움. 그리고 현재 인형을 꺼낸 배열의 값을 0으로 만들어줌
3. 인형의 종류가 같지 않다면 바구니 맨 위에 인형을 넣고 인형을 꺼낸 곳의 배열 값을 0으로 만들어 줌
위와 같은 방법으로 문제를 해결하였다.
소스 코드
파이썬
def solution(board, moves):
answer = 0
bascket = []
for back in moves:
back -= 1
for front in range(len(board)):
if board[front][back] != 0:
if len(bascket) != 0 and bascket[-1] == board[front][back]:
bascket.pop()
board[front][back] = 0
answer += 2
else:
bascket.append(board[front][back])
board[front][back] = 0
break
return answer
자바스크립트
function solution(board, moves) {
var answer = 0;
bascket = []
for (back of moves) {
back -= 1
for (var front = 0; front < board.length; front++) {
if (board[front][back] != 0) {
if (bascket.length != 0 && bascket[bascket.length - 1] == board[front][back]) {
bascket.pop()
board[front][back] = 0
answer += 2
} else {
bascket.push(board[front][back])
board[front][back] = 0
}
break
}
}
}
return answer;
}
def solution(s):
answer = 0
s = s.replace('zero', '0')
s = s.replace('one', '1')
s = s.replace('two', '2')
s = s.replace('three', '3')
s = s.replace('four', '4')
s = s.replace('five', '5')
s = s.replace('six', '6')
s = s.replace('seven', '7')
s = s.replace('eight', '8')
s = s.replace('nine', '9')
answer = int(s)
return answer
정규표현식을 사용해서 풀라고 준 문제인 것 같지만 정규 표현식을 사용하지 않고 파이썬 내장 함수를 이용해서 해결하였다.
string.lower() => string내의 모든 대문자를 소문자로 바꿔준다.
string.islower() => string내의 모든 문자가 알파벳 소문자로 이루어져 있으면 True, 아니면 False를 반환한다.
string.isdigit() => string내의 모든 문자가 숫자로 이루어져 있으면 True, 아니면 False를 반환한다.
string.replace(문자열 1, 문자열 2) => string내의 모든 문자열 1을 문자열 2로 치환한다.
위의 4개의 함수를 사용해서 해결하였다.
소스 코드
def solution(new_id):
new_id = new_id.lower()
answer = ''
for id in new_id:
if id.islower() or id.isdigit() or id in '-_.':
answer += id
while '..' in answer:
answer = answer.replace('..', '.') # 여러개를 하나로 줄여나감
if len(answer) > 1:
if answer[0] == '.':
answer = answer[1:]
if answer[-1] == '.':
answer = answer[:-1]
else:
if answer[0] == '.':
answer = ''
if answer == '':
answer = 'a'
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
while len(answer) <= 2:
answer += answer[-1]
return answer
import sys
n = int(sys.stdin.readline())
p = []
d = []
for i in range(n):
p.append(list(map(int, sys.stdin.readline().split())))
if i == 0:
d.append([p[0][0]])
continue
d.append([d[i-1][0] + p[i][0]])
for k in range(1, i):
d[i].append(max(d[i - 1][k - 1], d[i - 1][k]) + p[i][k])
d[i].append(d[i-1][i-1] + p[i][i])
print(max(d[n-1]))
있는 포도주를 최대로 마시고 싶은데 3잔 연속으로는 마실수 없다는 조건이 걸려있는 문제이다.
0번째 연속, 1번째 연속, 2번째 연속으로 마신 경우를 나누어서 고려해 3번째 연속으로 마시는 경우가 나올수 없게 하자.
d[i]를 i번째 까지 마셨을 때의 마신 포도주의 최대 값이라고 하고, p[i]를 i번째 포도주 잔에 들어있는 포도주의 양이라고 하자.
0번째 연속으로 마신 경우: d[i-1]
1번째 연속으로 마신 경우: d[i-2] + p[i]
2번째 연속으로 마신 경우: d[i-3] + p[i-1] + p[i]이 성립한다.
위의 점화식을 이용해 문제를 해결할 수 있다.
소스 코드
import sys
n = int(sys.stdin.readline())
p = []
for _ in range(n):
p.append(int(sys.stdin.readline()))
d = [p[0], p[0] + p[1] if n > 1 else 0, max(p[0] + p[2], p[1] + p[2], p[0] + p[1]) if n > 2 else 0]
for i in range(3, n):
d.append(max(d[i-3] + p[i-1] + p[i], d[i-2] + p[i], d[i-1]))
print(d[n-1])
import sys
mod = 10007
d = [[0 for _ in range(0, 10)] for __ in range(0, 1001)]
d[1] = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
N = int(sys.stdin.readline())
for i in range(2, N+1):
for j in range(0, 10):
for k in range(0, j+1):
d[i][j] += d[i-1][k]
d[i][j] %= mod
print(sum(d[N]) % mod)