[프로그래머스] Lv3.등굣길

[프로그래머스] Lv3.등굣길

출처: [코딩테스트 연습 등굣길]


문제

계속되는 폭우로 일부 지역이 물에 잠겼습니다. 물에 잠기지 않은 지역을 통해 학교를 가려고 합니다. 집에서 학교까지 가는 길은 m x n 크기의 격자모양으로 나타낼 수 있습니다.

아래 그림은 m = 4, n = 3 인 경우입니다.

image0.png

가장 왼쪽 위, 즉 집이 있는 곳의 좌표는 (1, 1)로 나타내고 가장 오른쪽 아래, 즉 학교가 있는 곳의 좌표는 (m, n)으로 나타냅니다.

격자의 크기 m, n과 물이 잠긴 지역의 좌표를 담은 2차원 배열 puddles이 매개변수로 주어집니다. 오른쪽과 아래쪽으로만 움직여 집에서 학교까지 갈 수 있는 최단경로의 개수를 1,000,000,007로 나눈 나머지를 return 하도록 solution 함수를 작성해주세요.


제한

  • 격자의 크기 m, n은 1 이상 100 이하인 자연수입니다.
    • m과 n이 모두 1인 경우는 입력으로 주어지지 않습니다.
  • 물에 잠긴 지역은 0개 이상 10개 이하입니다.
  • 집과 학교가 물에 잠긴 경우는 입력으로 주어지지 않습니다.

입출력

m n puddles return
4 3 [[2, 2]] 4

입출력 예 1

image1.png


풀이

-


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(m, n, puddles):
matrix = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
matrix[1][1] = 1

for i in range(1, n + 1):
for j in range(1, m + 1):
if i == 1 and j == 1:
continue
if [j, i] in puddles:
continue
else:
matrix[i][j] = matrix[i - 1][j] + matrix[i][j - 1]
return matrix[n][m] % 1000000007


print(solution(4, 3, [[2, 2]]))

[백준] 10844번 쉬운 계단 수

[백준] 10844번 쉬운 계단 수

출처: [백준] 10844번 쉬운 계단 수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 77392 23572 16910 28.505%

문제

45656이란 수를 보자.

이 수는 인접한 모든 자리수의 차이가 1이 난다. 이런 수를 계단 수라고 한다.

세준이는 수의 길이가 N인 계단 수가 몇 개 있는지 궁금해졌다.

N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구하는 프로그램을 작성하시오. (0으로 시작하는 수는 없다.)


입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.


출력

첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.


예제 입력 1

1
1

예제 출력 1

1
9

예제 입력 2

1
2

예제 출력 2

1
17

힌트


출처


알고리즘 분류


시간 제한


풀이


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys

input = sys.stdin.readline

dp = [[1 for _ in range(10)]]
for i in range(99):
dp.append([0 for _ in range(10)])

for i in range(99):
for j in range(10):
if 1 <= j < 9:
dp[i + 1][j] = dp[i][j - 1] + dp[i][j + 1]
elif j >= 9:
dp[i + 1][j] = dp[i][j - 1]
elif j <= 0:
dp[i + 1][j] = dp[i][j + 1]
# print(dp)
n = int(input())
print((sum(dp[n - 1]) - dp[n - 1][0]) % 1000000000)
[백준] 1003번 피보나치 함수

[백준] 1003번 피보나치 함수

출처: [백준] 1003번 피보나치 함수


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.25 초 (추가 시간 없음) 128 MB 115259 30059 23610 30.125%

문제

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

1
int` `fibonacci(``int` `n) {``  ``if` `(n == 0) {``    ``printf``(``"0"``);``    ``return` `0;``  ``} ``else` `if` `(n == 1) {``    ``printf``(``"1"``);``    ``return` `1;``  ``} ``else` `{``    ``return` `fibonacci(n‐1) + fibonacci(n‐2);``  ``}``}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

  • fibonacci(3)fibonacci(2)fibonacci(1) (첫 번째 호출)을 호출한다.
  • fibonacci(2)fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
  • 두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
  • fibonacci(0)은 0을 출력하고, 0을 리턴한다.
  • fibonacci(2)fibonacci(1)fibonacci(0)의 결과를 얻고, 1을 리턴한다.
  • 첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
  • fibonacci(3)fibonacci(2)fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.


출력

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.


예제 입력 1

1
2
3
4
3
0
1
3

예제 출력 1

1
2
3
1 0
0 1
1 2

힌트


출처


알고리즘 분류


풀이


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import sys

input = sys.stdin.readline
t = int(input())

cnt0 = [1, 0]
cnt1 = [0, 1]

for i in range(2, 41):
cnt0.append(cnt0[i - 1] + cnt0[i - 2])
cnt1.append(cnt1[i - 1] + cnt1[i - 2])

for _ in range(t):
n = int(input())
print(f"{cnt0[n]} {cnt1[n]}")

[백준] 10870번 피보나치 수5

[백준] 10870번 피보나치 수5

출처: [백준] 10870번 피보나치 수5


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 32430 20856 18483 65.290%

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 n이 주어진다. n은 20보다 작거나 같은 자연수 또는 0이다.


출력

첫째 줄에 n번째 피보나치 수를 출력한다.


예제 입력 1

1
10

예제 출력 1

1
55

힌트


출처


알고리즘 분류


비슷한 문제


풀이


소스코드 1 (재귀를 이용한 다이나믹 프로그래밍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import sys

input = sys.stdin.readline

n = int(input())

fibo_memo = [-1] * 99


def fibo_dynamic(n):
if 0 < n <= 2:
return 1
elif n == 0:
return 0
if fibo_memo[n] != -1:
return fibo_memo[n]
fibo_memo[n] = fibo_dynamic(n - 1) + fibo_dynamic(n - 2)
return fibo_memo[n]


print(fibo_dynamic(n))

[백준] 10826번 피보나치 수4

[백준] 10826번 피보나치 수4

출처: [백준] 10826번 피보나치 수4


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 8506 2779 2352 39.437%

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 n이 주어진다. n은 10,000보다 작거나 같은 자연수 또는 0이다.


출력

첫째 줄에 n번째 피보나치 수를 출력한다.


예제 입력 1

1
10

예제 출력 1

1
55

힌트


출처


알고리즘 분류


비슷한 문제


풀이


소스코드 1 (반복문을 이용한 다이나믹 프로그래밍)

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

input = sys.stdin.readline
fibo = [-1] * 10001
fibo[0] = 0
fibo[1] = 1

N = int(input())

for i in range(2, N + 1):
fibo[i] = fibo[i - 1] + fibo[i - 2]

print(fibo[N])
[백준] 2748번 피보나치 수2

[백준] 2748번 피보나치 수2

출처: [백준] 2748번 피보나치 수2


시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 128 MB 54967 21274 17729 38.752%

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.


입력

첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.


출력

첫째 줄에 n번째 피보나치 수를 출력한다.


예제 입력 1

1
10

예제 출력 1

1
55

힌트


출처


알고리즘 분류


비슷한 문제


풀이


소스코드 1 (반복문을 이용한 다이나믹 프로그래밍)

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

input = sys.stdin.readline
fibo = [-1] * 100
fibo[0] = 0
fibo[1] = 1

N = int(input())

for i in range(2, N + 1):
fibo[i] = fibo[i - 1] + fibo[i - 2]

print(fibo[N])

소스코드 2 (재귀를 이용한 다이나믹 프로그래밍)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import sys

input = sys.stdin.readline

n = int(input())

fibo_memo = [-1] * 99


def fibo_dynamic(n):
if n <= 2:
return 1
if fibo_memo[n] != -1:
return fibo_memo[n]
fibo_memo[n] = fibo_dynamic(n - 1) + fibo_dynamic(n - 2)
return fibo_memo[n]

print(fibo_dynamic(n))

[백준] 1912번 연속합 with Python

[백준] 1912번 연속합 with Python

출처: [백준] 1912번 연속합


문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.


입력

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.


출력

첫째 줄에 답을 출력한다.


예제 입력 1

1
2
10
10 -4 3 1 5 6 -35 12 21 -1

예제 출력 1

1
33

예제 입력 2

1
2
10
2 1 -4 3 4 -4 6 5 -5 1

예제 출력 2

1
14

예제 입력 3

1
2
5
-1 -2 -3 -4 -5

예제 출력 3

1
-1

힌트


출처


알고리즘 분류


풀이


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

input = sys.stdin.readline

N = int(input())
num_list = list(map(int, input().split()))
dp = [num_list[0]]

for i in range(N - 1):
dp.append(max(dp[i] + num_list[i + 1], num_list[i + 1]))

print(max(dp))

[백준] 9251번 LCS

[백준] 9251번 LCS

출처: [백준] 9251번 LCS


문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.


입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.


출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.


예제 입력 1

1
2
ACAYKP
CAPCAK

예제 출력 1

1
4

힌트


출처


알고리즘 분류


풀이


소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import sys

input = sys.stdin.readline

str1 = ' ' + input().rstrip()
str2 = ' ' + input().rstrip()

dp = [[0] * len(str2) for _ in range(len(str1))]

for i in range(1, len(str1)):
for j in range(1, len(str2)):
if str1[i] == str2[j]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])

print(dp[-1][-1])