일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 백준
- MSA
- 백준 16235
- java 기술면접
- spring oauth
- java
- 프로그래머스
- 백준 17626
- 백준 파이썬
- 백준 17779
- sql 기술면접
- re.split
- 웹어플리케이션 서버
- Spring Boot
- Spring
- 백준 15685
- with recursive
- 백준 16236
- JVM
- MySQL
- Coroutine
- springboot
- 파이썬
- 프로래머스
- spring cloud
- spring security
- 백준 16719
- JPA
- Kotlin
- 백준 19238
- Today
- Total
목록알고리즘 (178)
시작이 반
n까지의 숫자가 주어졌을때 1 ~ n을 스택에 push하고 언제 pop할 것인지 정하면된다. ex) 입력 n = 8 list = 4 3 6 8 7 5 2 1 일때 1 ~ 8까지 스택에 차례로 push를 하면서 스택의 top과 list[j]의 숫자가 같다면 pop을 하고 j 를 1증가시킨다. import sys input = sys.stdin.readline n = int(input()) input_number = list(int(input()) for _ in range(n)) stack = list() result = list() j = 0 for i in range(1, n+1): stack.append(i) result.append('+') while stack and input_number[j] ..
백준의 9012 괄호문제와 비슷한 문제이다. 문자열에서 '('와 '['를 만나면 stack에 쌓아준다. ']'를 만나면 stack의 top을 확인하여 '['일때 pop을 해주고 아니면 no를 출력한다. 마찬가지로 ')'를 만나면 stack의 top을 확인하여 '('일때 pop을 해주고 아닐때 no를 출력한다. 이전에 풀었던 9012의 코드를 이용해서 풀어서 출력이 소문자인 것을 확인 못하고 계속 왜 틀렸는지 생각했다... (시간 날림....) import sys input = sys.stdin.readline while True: string = list(input()) string.pop() if string[0] == '.' and len(string) == 1: break ps = list() sm..
스택에 관련된 문제이다. '('을 확인하면 stack에 쌓고 ')'을 확인하면 stack에서 pop한다. t = int(input()) for _ in range(t): ps = list(input()) stack = list() is_empty = False for i in range(len(ps)): if ps[i] == '(': stack.append(ps[i]) else: if not stack: is_empty = True break else: stack.pop() if not stack and not is_empty: print('YES') else: print('NO')
조합을 구하는 문제이다. 하지만 같은 종류의 옷은 동시에 입을 수 없다. 즉, 같은 종류의 옷들을 묶은다음 해당 종류별로 경우의 수를 곱해주면 된다. 만약 hat headgear sunglasses eyewear turban headgear 가 있다면 headgear : 2개 eyewear : 1개이다. (dict을 이용하면 된다.) 이러면 headgear을 고를 경우의 수 ( 2 + 1 (hat, turban, 아무것도 안고를 경우)) eyewaer을 고를 경우의 수 ( 1 + 1 (sunglasses, 아무것도 안고를 경우)) = 6인데 문제에서 아무것도 안입으면 안되기 때문에 여기서 아무것도 안입는 경우 1을 빼준다. 6-1이 답이다. 처음에는 파이썬의 combination을 사용하여 풀었지만 메모..
nCr = n!/(n-r)!r! 을 이용하면 된다. 하지만 단순 팩토리얼을 이용하여 풀면 n, m 이 20억이될 수 있기 때문에 시간초과, 또는 메모리 초과가 될 것이다. 끝자리가 0이라는 것은 2 와 5의 곱으로 이루어 졌으면 0이 된다. 만약 xxxxx00 이면 2가 2개 5가 2개의 곱으로 이루어 졌다는 것이다. 즉, 2, 5의 쌍을 구하면 0의 갯수를 구할 수 있다. 하지만 이것도 반복문으로 돌리다보니 계속 시간초과가 났다... 도저히 모르겠어서 답을 본 결과... def two_count(n): two = 0 while n != 0: n = n // 2 two += n return two 이런식으로 2의 갯수를 구하는 것을 알 수 있었는데.... 사실 이 식만봤을때 뭔소린지 이해를 못했다... ..
수학적 이론이 필요한 문제이다. M 을 찾아야한다. A = M * a + R B = M * b + R C = M * c + R 여기서 R을 제거하면 A - B = M ( a - b ) B - C = M ( b - c ) 이런 식이 나온다. 즉, M은 A-B, B-C의 공약수이다 즉 최대공약수를 구하면 된다. 최대 공약수를 구하고 해당 수의 1을 제외한 약수를 출력하면된다. 이때 최대 공약수를 구하고 약수를 구할때 반복문을 최대공약수 까지 돌려버리면 숫자 범위가 1,000,000,000까지기 때문에 엄청난 시간이 걸린다. 그래서 공약수를 구할때 18 % 2 = 0 ( 2 = 약수) 18 // 2 = 9 ( 9 = 약수) 이 2개를 한번에 구한다 이러면 반복횟수를 최대공약수의 제곱근 까지 줄일수 있다. 마지..
그리디 문제라고 나와있지만 그리디 보다는 문자열 처리 문제같다... -가 나오면 다음 - 가 나올때까지 숫자를 더해주고 더한 숫자를 list에 저장하고를 반복한다. list에 저장된 숫자를 다 더한후 음수로 만들고 맨 처음 숫자를 더해준다. express = input() split = list() result = list() start = 0 for i in range(len(express)): if express[i] == '-' or express[i] == '+': split.append(int(express[start:i])) split.append(express[i]) start = i + 1 split.append(int(express[start:])) start = 0 for i in ra..