목록분류 전체보기 (447)
For Programmer
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWYygN36Qn8DFAVm SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 간단한 구현문제이다. import sys sys.stdin = open('input.txt', 'r') T = int(input()) for order in range(1, T + 1): N, Q = map(int, input().split()) array = [0 for x in range(N + 1)] for i in range(1, Q + 1): # Q의 횟수만큼 L, R = map(int, ..
위 문제 문과생에겐 너무 어려운 문제이다.... 해설을 보니 nCm 은 n!/m!*(n-m)! 과 같다고 한다. 여기서 생각할 수 있는 점은 어떤수의 0의 개수는 10^k * n 이라고 할 수 있다. 예를 들어 0이 5개이면 10^5 * n 이라고 할 수 있다. 여기서 10은 다시 (2*5)^5 로 나눌 수 있는데 이는 즉, 2와5의 짝이 5개 있다는 말이다. 따라서 n!/m!*(n-m)! 식에서 n! 의 2와 5의 승수를 구하고 m!,(n-m)!의 승수를 구해서 빼주면 된다. 여기서 빼는 이유는 승수의 나눗셈 계산은 빼기이기 때문이다. 그리고 짝을 찾아서 짝의 개수만큼 출력해주면 된다. # 5의 승수 구하기 def five_power_n(N): count_5_1 = 0 X = 5 while X
위 문제는 직접 적어보면 다음과 같이 나온다. # 20!에 곱해진 2의 개수 # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 # 1 1 1 1 1 1 1 1 1 1 #2가 곱해진 개수 5개 # 1 1 1 1 1 #2가 곱해진 개수 3개 # 1 1 #2가 곱해진 개수 2개 -> 즉, 처음에 2가 한개 곱해진 개수 5개이다. 추가적으로 4(2*2), 8(2*2*2) 16(2*2*2*2) 이므로 추가적으로 2가 곱해진 개수를 더해주는 식으로 구하면된다. 이런식으로 하다보면 개수를 찾을 수 있는데 여기의 개수는 20을 2나눈 개수 + 20을 2*2 로 나눈 개수 + 20을 2*2*2로 나눈개수 + 20을 2*2*2*2 로나눈 개수와 동일하다. 해당 식을 코드로 작성..
이 문제는 에라토스테네스의 체만 구현할 수 있으면 쉽게 해결할 수 있는 문제이다. T = int(input()) # 에라토스테네스의 체 구하기 sosu = [True] * (1299709 + 1) sosu[0], sosu[1] = False, False for i in range(1, 1299709 + 1): if not sosu[i]: continue for j in range(i * i, 1299709 + 1, i): sosu[j] = False for _ in range(T): N = int(input()) # 만약 소수 라면 0 출력 if sosu[N]: print(0) else: # 소수가 아니라면 i = N # 왼쪽으로 이동할 인덱스 j = N # 오른쪽으로 이동할 인덱스 count = 1 #..
이 문제 완탐 돌리면 당연히 시간초과이다. 따라서 식을 찾아야하는데 몇번 해보면 1~3 = 1 , 4~8 = 2 , 9 ~ 15 = 3 , 16 ~ 24 = 4 와 같은 공식을 찾을 수 있다. 즉, N을 루트를 씌우고 int를 할 경우 똑같은 정수가 되는 구간이다. 하지만 나는 이러한 수학식을 빨리 찾지 못해 이 자체를 반복문을 구현 했다. 어찌어찌 pypy3로는 통과가 되긴 했다.. 1. 정답 import math N = int(input()) print(int(math.sqrt(N))) 2. 위 식을 완탐으로 찾기.. N = int(input()) count = 1 i = 3 index = 0 while True: for j in range(1, i + 1): index += 1 if index >=..
이 문제는 간단히 유클리드 호제법으로 풀 수 있다. # 최대 공약수 찾는 공식: 유클리드 호제법 T = int(input()) for _ in range(T): nums = list(map(int, input().split())) nums.sort() # 유클리드 호제법을 실행하기 위해 정렬해준다. max_GCD = 0 # 가장 큰 최대 공약수 저장할 변수 for i in range(len(nums)): for j in range(i + 1, len(nums)): a, b = nums[j], nums[i] # a > b while a % b != 0: #유클리드 호제법 실행 a, b = b, a % b if max_GCD < b: max_GCD = b print(max_GCD)
이 문제 정말 어려웠다. 기존 투포인터 응용 문제라 아무리 생각해도 답이 생각 나지 않았다. 그렇게 힌트를 얻어서 생각 한것이 우선 2개의 합을 이중 반복문을 돌아서 각각의 인덱스 와 함께 저장한다. ( a, b , array[a+b]) 와 같은식, 그렇게 이렇게 2개의 합을 찾은 리스트를 우선 정렬한다. 그 후 다시 이중 반복문을 돌면서 앞에서 부터 인덱스 4개가 모두 다른 합 2개를 뽑으면 처음 찾은 그것이 바로 최소 차가 되는 것이다. (왜냐하면 그 이후에 찾은 것은 이미 앞에 뽑은 수 보다 무조건 크기 때문에 차가 커질 수 밖에 없다.) N = int(input()) array = list(map(int, input().split())) new_arr = [] for i in range(N): f..
이 문제는 간단히 K개 구간의 고장난 신호등 개수를 저장한 후 맨앞 신호등을 하나 빼주고 다음 신호등을 넣어준다. 단, 맨앞 신호등이 고장난 신호등이면 현재 고장난 신호등 개수를 -1 해주고 넣어줄 신호등이 고장난 신호등이면 +1 해준다. 이런식으로 계산했을 때 가장 작은 값을 출력하면 된다. N, K, B = map(int, input().split()) signal = [1 for _ in range(N + 1)] # 신호등 정보를 1로 받는다. result = 0 # 고장난 신호등 개수를 저장할 변수 for i in range(B): # 고장난 신호등 B개를 0으로 바꿔준다. temp = int(input()) signal[temp] = 0 if temp = N: # e가 N과 같아지면 더이상 비교..