반응형

자료구조 및 알고리즘/백준 54

[python] 1065. 한수

문제 올바른 풀이 N = int(input()) def check_hansu(num, check): if num > 99: # 1000보다 작은 자연수 num_str = [int(i) for i in str(num)] if num_str[1]-num_str[0] == num_str[2]-num_str[1]: check = 1 else: check = 1 return check check = 0 cnt = 0 for i in range(1, N+1): cnt += check_hansu(i, check) print(cnt) 해당 문제는 각 자리수의 차가 동일한지를 확인하는 문제이다. 완전 탐색으로 문제를 해결하면 되는데, 1000보다 작거나 같은 자연수만큼 for문을 돌려서 각 자리수의 차를 확인해보면 된다..

[python] 4673. 셀프 넘버

문제 나의 풀이 not_self_number = list() for i in range(1, 10001): number = [int(num) for num in str(i)] not_self_number.append(sum(number) + i) if i not in not_self_number: print(i) 나는 각 자릿수를 더하는 과정을 string으로 변환하여 for문으로 처리하였다. 그리고 self_number가 아닌 숫자들을 담을 list를 만들어서 생성자를 담아준다. 최종적으로 생성자가 없는 셀프 넘버를 출력한다. 남의 풀이 def self_number(num): self_num = num while num != 0: self_num += num%10 # 오른쪽 끝 숫자를 더함 num //..

[python] 1436. 영화감독 숌

문제 잘못된 풀이 N = int(input()) num_list = list() num_list.append(666) for i in range(1, 10001): num = str(i) + str(666) num_list.append(int(num)) num = str(666) + str(i) num_list.append(int(num)) num_list.sort() print(num_list[N-1]) 666을 기준으로 앞 뒤에 숫자를 붙여서 .sort()한다면 문제를 해결할 수 있을 것이라고 생각했다. 올바른 풀이 N = int(input()) cnt = 0 num = 1 while True: if '666' in str(num): cnt+=1 if cnt==N: print(num) break nu..

[python] 2231. 분해합

문제 잘못된 풀이 N = int(input()) num_list = list() for i in range(1, N+1): num = [int(i) for i in str(i)] # print(num, sum(num)+i) # print(i) if i>=9 and sum(num)+i == N: num_list.append(i) print(min(num_list)) 해당 문제를 잘 풀었다고 생각했는데, runtime 에러가 나왔다. data type의 문제라고 생각했는데 생성자가 0일 경우의 처리를 하지 않았다. 문제점이 무엇인지 바로 파악했기 때문에, 쉽게 문제를 해결할 수 있었다. 올바른 풀이 N = int(input()) for i in range(1, N+1): num = [int(i) for i ..

[python] 2798. 블랙잭

문제 잘못된 풀이 N, M = map(int, input().split()) num = list(input().split()) result = list() for i in num[:-2]: for j in num[1:-1]: for k in num[2:]: if i==j or j==k or i==j: continue # print(i, j, k) if int(i)+int(j)+int(k) M: continue else: nlst.append(three) print(max(nlst)) 따라서 나는 삼중 for문의 범위를 다음과 같이 알맞게 설정하였고, 문제를 해결할 수 있었다. 이번 문제는 어렵지 않아서, 빠른 시간 내에 문제점을 찾고 해결할 수 있었다.

[python] 1149. RGB거리

문제 잘못된 풀이 import sys n = int(input()) dp = [0] * n for i in range(n): home_list = list(map(int, sys.stdin.readline().split())) tmp = home_list[:] if i != 0: del tmp[idx] dp[i] = min(tmp) idx = home_list.index(dp[i]) print(sum(dp)) 해당 문제에서 제공한 규칙의 알고리즘은 '이전 집과 색깔이 겹치지 않으면' 된다. 따라서 내가 (잘못) 생각한 방법은 다음과 같다. 첫번째 집: 일단 첫번째 집에서 가장 작은 값을 찾는다. 그 다음 집과 색깔이 겹치지 않도록 index를 찾아 저장한다. 두번째 집 ~ : 앞 집의 index를 제외한..

[python] 1912. 연속합

문제 올바른 풀이 n = int(input()) num_list = list(map(int, input().split())) for i in range(1, n): num_list[i] = max(num_list[i-1] + num_list[i], num_list[i]) print(max(num_list)) 해당 문제는 다이나믹 프로그래밍으로 해결할 수 있다. 최댓값을 구하기 위한 풀이방법은 다음과 같다. i번째까지의 수를 더한 값보다 i번째 값이 크면 그 이전 값은 무시한다. 즉, i번째까지의 누적값이 i번째보다 작으면 계속해서 더해가지만 i번째 값이 크면 누적값을 무시하고 i번째부터 다시 값을 더해간다고 이해하면 될 것 같다.

[python] 1904. 01타일

문제 잘못된 풀이 (런타임에러, 메모리초과) N = int(input()) dp = [0] * (N+1) dp[1] = 1 dp[2] = 2 for i in range(3, N+1): dp[i] = dp[i-1] + dp[i-2] print(dp[N] % 15746) 해당 코드로 작성하면 런타임에러와 메모리초과가 발생한다. 파이썬은 int형의 고정된 크기가 아니다. 그 변수가 실제로 담고 있는 값의 크기에 따라, 유동적으로 사용하는 메모리가 변한다. 수가 매우 커지게 되면 그 수를 정확하게 표현하기 위해 점점 더 많은 메모리를 할당받게 되는데, 해당 문제의 경우 무턱대고 모든 항의 값을 다 구하려고 하면 N에 비례하여 자릿수가 점점 늘어나기 때문에 총 사용하게 되는 공간 복잡도가 O(N^2)가 된다. 배..

[python] 9184. 신나는 함수 실행

문제 올바른 풀이 import sys def w(a, b, c): if a 20: return w(20, 20, 20) if dp[a][b][c]: # 이미 구한 값 이라면 바로 출력 return dp[a][b][c] if a < b and b < c: dp[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c) else: dp[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1) return dp[a][b][c] dp = [[[0]*(21) for _ in range(21)] for _ in range(21)] while True: a, b, c = map(int, sys.s..

728x90
반응형