목록분류 전체보기 (447)
For Programmer
조금 귀찮은 구현이다. 특히 최빈값 구하는게 가장 귀찮다. 나는 계수정렬에서 사용하는 방식인 미리 count 리스트를 8000개 만들어 놓고 개수를 추가해서 최대 개수가 있는 인덱스를 찾는 방식으로 하였다. import sys # 입력 빠르게 받기 input = sys.stdin.readline N = int(input()) sum_ = 0 # 합계저장 middle = 0 count_list = [0] * 8001 mode = 0 arr = [] for i in range(N): temp = int(input()) # 전체합 sum_ += temp # 입력받은 값을 리스트에 추가 arr.append(temp) # 최빈값 구하기 위해 count 저장(음수도 저장하기 위해 4000씩 밀어주고 출력할때 빼준다..
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AX6PUEfaqAADFAS9 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 이 문제 상당히 어려워서 고민을 많이했다. 하루 정도 고민한 뒤에 힌트를 얻어서 풀었다. 자꾸 소인수 분해를 해서 해결할려고하였는데 약수를 구해서 해결할 수 있었다. 문제풀이 방식은 다음과 같다. 1. 문제에서 답은 입력받은 수를 오름차순 했을때 첫번째 아니면 두번째 수의 약수 중에 존재한다.(값을 교체해도 하나만 교체할 수 있기 때문에) + (최대 공약수는 가장 작은수의 크기를 넘을 수 없다.) ..
이 문제는 간단히 10^12 까지 소인수 분해를 할 수 있냐를 묻는 문제이다. 그러나 O(N)으로는 못돈다. 따라서 최적화된 소인수 분해 코드를 짜야하는데 O(logN) 으로 구할 수 있는 소인수 분해 식이 있다. 예를들어 어떤 n의 소인수 분해는 a*b*c*d*e*f*g*h*i => n 다음과 같이 표현이 가능하다. 여기서 중요한 점은 a~i 까지의 수중에 sqrt(N)보다 큰 수는 많아봐야 1개(i) 이거나 없다.(제곱수 일때) 따라서 이러한 점을 이용해서 식을 짜면 된다. K = int(input()) # 소인수 분해 최적화(logN) def prime(k): x = k arr = [] for i in range(2, k): if i * i > k: break while x % i == 0: arr..
이 문제 코드 다 짜놓고 계속 틀리길래 엄한데 찾고 있었다.. 테케에서 입력횟수 제한을 안두면 알아서 try except로 EOFerror를 잡아줘야 한다. (참나... 이것때문에 엄한데서 오류를 찾고 2시간을 소비했다.... 죽어도 까먹지 말자.) 이 문제는 우선 K를 소인수 분해 해준다. 그렇다면 다음과 같이 소수 형태로 변한다.(2^3 * 3^5 * 7^2)... 그렇다면 이 소수들의 지수와 n!에서의 해당 소수의 지수 개수를 비교 해준다. 그 후 두개중 작은 개수를 최대공약수에 계속해서 곱해주면 된다. 예를들어) k의 소인수 분해 결과가 2^3 * 3^5 * 7^2 라고 하자. 하지만 n이 10이라서 10! 내에서는 2의 지수의 개수가 18개 3의 지수의 개수가 4개 7의 지수의개수가 1개이다. ..
이 문제 설명은 여기서 너무 잘되어 있어서 링크 남기겠다. 아무리 생각해도 못찾겠는데 약간 수학식으로 풀어야하는 문제였다. https://algosu.tistory.com/9 [C++] 백준 2436 - 공약수 https://www.acmicpc.net/problem/2436 2436번: 공약수 첫째 줄에 두 개의 자연수가 빈칸을 사이에 두고 주어진다. 첫 번째 수는 어떤 두 개의 자연수의 최대공약수이고, 두 번째 수는 그 자연수들의 최소공 algosu.tistory.com # 유클리드 호제법 사용 def uclid(a, b): while a % b != 0: a, b = b, a % b if b == 1: return True else: return False def solution(N, M): num..
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWNcJ2sapZMDFAV8 SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 이 문제 너무 어렵게 생각해서 3시간을 넘게 생각했는데 풀리질 않았다. 힌트를 보니 정말 쉽게 접근할 수 있었다. 간단히 총 복도 길이 리스트 만들고 지나간 길을 +1씩 해주면 된다.. 그 후 가장 많이 지나간 복도(최대값) 출력하면 된다. (심지어 중간에 이 풀이 방식도 생각을 했으나 +1씩 한것이 과연 문제에 해결할 수 있을까? 라고 생각을 하고 지나쳤는데 그게 답이었다.. ) 조금 생각해야 할..
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LrsUaDxcDFAXc SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 이 문제 이상하게 index 함수와 슬라이싱을 사용하면 10가지 출력이 모두 맞는데도 불구하고 런타임에러가 발생한다. 아마 숫자가 21억을 넘어가서 그런거 같다. (정확한 이유는 모르겠음..) 그래서 일반 for문으로 구성하니 정답이 출력되었다. 그리고 또한 반대로 탐색하며 마지막 인덱스를 최대값으로 설정하여 앞으로 탐색하면서 자신과 값의 차를 계속해서 더해준다. 그리고 만약 자신보다 높은 숫자가 ..
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWVl47b6DGMDFAXm SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! swexpertacademy.com 이 문제 알면쉽고 모르면 생각을 꽤 하는 문제이다. 간단히 풀이방식은 '(' 을 만나면 현재 개수와 전체 개수를+1 씩 추가해주고 만약 레이저를 만나면 현재 저장된 개수를 그대로 전체개수에 한번더 추가해준다. 그리고 ')' 를 만날때 레이저가 아니라면 현재 개수를 -1 씩 해주는 식으로 문제를 풀었다. import sys sys.stdin = open('input.txt', 'r', encoding..