첫째 줄에 정수 N과 K가 공백을 기준으로 구분되어 주어진다. (0≤N≤23, 0≤K≤9)
1 2 3 4 5
import sys input = sys.stdin.readline
n, k = map(int, input().split()) count = 0
Brute Force
n시 59분 59초까지
k가 시/ 분/ 초에 포함된 경우 count
hidden case : k == 0인 경우
시/ 분/ 초가 10보다 작을 경우 0을 붙여야 0 케이스 체크 가능
1 2 3 4 5 6 7 8
for h inrange(n+1): for m inrange(60): for s inrange(60): check_hour = (str(k) in add_zero(h)) check_min = (str(k) in add_zero(m)) check_sec = (str(k) in add_zero(s)) if check_hour or check_min or check_sec: count += 1
Output
00시 00분 00초부터 N시 59분 59초까지의 모든 시각 중에서 K가 하나라도 포함되는 시각들의 수를 출력한다.
맨 처음 접근 방식은 중첩 for문을 돌면서 글자가 같으면 index를 동시에 증가시키고 이 작업을 반복한 후 최대 값을 출력하는 거였다. 근데 이렇게 하면 동일한 수열이 처음으로 만나는 글자부터가 아니라 중간에 만나는 글자부터 시작할 수 있기 때문에 아예 틀린 방식이 됨.
두번째는 방식은 맞는데 시간 초과가 떴다. 4중 for문을 돌렸기 때문^.< 아주 초과가 날 수 밖에… 그래도 접근 방식은 맞았다. 이 문제를 어떻게 풀어야 할지 제대로 파악하지 않고 접근했기 때문에 1번째 방식처럼 생각했던 거라, 제대로 어떻게 풀어야 할지부터 파악했다. dp를 2차원 배열로 생성해야 한다는 힌트만 얻고 풀어봤는데, 실제로 첫번째에서도 dp는 2차원 배열일 수 밖에 없었어서 조금만 더 생각해보면 이 힌트도 없어도 됐다. 암튼 조건을 더해보면,
각 string의 길이를 배열 크기로 설정해서 2차원 배열 dp을 만들고
1
dp = [['']*len(str2) for _ inrange(len(str1))]
2중 for문을 돌면서 동일한 글자일 시 dp[i-1][j-1] 에 저장되어 있는 str에 해당 글자를 더하면 된다.
1 2 3 4
for i inrange(1, len(str1)): for j inrange(1, len(str2)): if str1[i] == str2[j]: dp[i][j] = dp[i-1][j-1] + str1[i]