[Link] Codility Link
Codility 에서 푼 문제 링크를 보관할 글 입니다.**
BinaryGap
https://app.codility.com/demo/results/trainingUKVSGG-JBD/ (60/100)
https://app.codility.com/demo/results/trainingGNS8YW-NXK/ (100/100)
CyclicRotation
https://app.codility.com/demo/results/trainingX7S2BW-Z5D/ (100/100)
https://app.codility.com/demo/results/trainingNGPK2Z-QWP/?showingAll=1 (100/100, JAVA)
- 기존의 배열을 인자로 전달된 횟수만큼 돌리는 것
- 새로운 임시배열을 만들어서 인덱스를 수학적으로 구한후, 횟수만큼 돌려진 배열을 반환함
OddOccurrencesInArray
https://app.codility.com/demo/results/trainingRRVPPN-CKV/ (66/100)
https://app.codility.com/demo/results/trainingXEP7GG-QJ6/ (100/100)
https://app.codility.com/demo/results/trainingPYN8QV-3VS/?showingAll=1 (100/100, JAVA)
- 배열중에서 Pair 된 녀석들을 제외한 홀로 남은 숫자를 찾는 것
- Java 에서 HashSet 을 이용해서 풀음
FrogJmp
https://app.codility.com/demo/results/training6M9K8G-E93/ (33/100)
https://app.codility.com/demo/results/trainingC8DQU5-3XN/ (100/100)
https://app.codility.com/demo/results/trainingSP4CVF-3SP/?showingAll=1 (100/100, JAVA)
- 개구리가 점프할 수 있는 횟수를 구하는건데, 나눗셈과 나머지연산을 통해 간단하게 구현함
PermMissingElem
https://app.codility.com/demo/results/trainingZX2TG6-XTK/ (10/100)
https://app.codility.com/demo/results/trainingM7YHQ2-FZS/ (100/100)
https://app.codility.com/demo/results/training9WYS29-48S/?showingAll=1 (100/100, JAVA)
- 2,5,1,3 이란 배열이 주어지면 중간에 빠진 값을 찾는건데
- boolean 배열을 만들어서 각각 기록해놓고
- 나중에 배열을 순회하면서 false가 뜨면 바로 리턴
TapeEquilibrium
https://app.codility.com/demo/results/trainingMZG8KV-THY/ (83/100)
https://app.codility.com/demo/results/training7FAHTH-VGW/ (100/100)
https://app.codility.com/demo/results/trainingG2BCAB-UNZ/ (100/100) 코드 최적화
https://app.codility.com/demo/results/trainingBG9456-ZBM/?showingAll=1 (100/100, JAVA)
- 각 배열의 사이 인덱스에서 각 차분을 구해서 가장 최솟값을 구하는 경우이다
- Integer.MAX_VALUE 는 꽤 신박했음
- foreach 문을 쓰면 배열을 다 탐색하기 때문에 이상한 값이 출력될 수 있다는 것을 항상 인지
- 일단은 for 문으로?
PermCheck
https://app.codility.com/demo/results/trainingXMQDSU-A5K/ (75/100)
https://app.codility.com/demo/results/trainingZPHEFQ-KUH/ (100/100)
https://app.codility.com/demo/results/trainingMZDVRM-C8U/?showingAll=1 (100/100, JAVA)
- 이것 역시 boolean 을 통해서 체크할 배열을 만들어놓고 체크를 해주면 되는데
- 약간의 조건식이 필요했다. 이 조건식이 없어서 처음에50%가 나왔는데 중간에 걸러주는 조건식들을
- 생각하는 훈련이 필요할 듯 하다
FrogRiverOne
https://app.codility.com/demo/results/trainingDKDR66-AK3/ (18/100)
https://app.codility.com/demo/results/training9D35XM-QQS/ (27/100)
https://app.codility.com/demo/results/training2N78YZ-55A/ (54/100)
https://app.codility.com/demo/results/trainingVE2UW9-XXG/ (100/100)
https://app.codility.com/demo/results/trainingEHAKFF-F56/?showingAll=1 (100/100, JAVA)
- 문제를 이해하기 좀 힘들었다
- 자료구조 HashSet 을 이용해서 조건을 검사해서 간단하게 해결
MissingInteger
https://app.codility.com/demo/results/training55RTHV-YRJ/ (100/100)
https://app.codility.com/demo/results/trainingDAWN6Q-SUD/?showingAll=1 (100/100, JAVA)
- 인자로 들어온 배열의 길이를 가지고 새로운 배열을 생성할 때
- 안의 인자의 값이 꼭 배열의 길이보다 낮을거란 생각은 ㄴㄴ
- 항상 예외로 해줘야 하는지 체크하는 생각을 들이자 :)
MaxCounters
https://app.codility.com/demo/results/trainingQHD8ZZ-YSE/ (77/100)
https://app.codility.com/demo/results/trainingTKYUJ2-TDG/ (100/100)
https://app.codility.com/demo/results/trainingDZS4Z8-J7U/?showingAll=1 (100/100, JAVA)
- 배열을 1부터 끝까지 값을 채우거나 순회하는 부분은 시간복잡도에서 걸릴 가능성이 매우 크므로
- 따로 뺄 수 있는 부분을 변수를 통해서 저장해놓고, 나중에 그 값들만 처리할 것
- 중간에 continue Point 만 있어도 시간복잡도가 많이 개선된다.
PassingCars
https://app.codility.com/demo/results/training9QTZQU-JNB/ (10/100)
https://app.codility.com/demo/results/trainingSJSTAZ-A5X/ (70/100)
https://app.codility.com/demo/results/trainingNWTEU9-4V8/ (100/100)
https://app.codility.com/demo/results/training4MP7HQ-HRK/?showingAll=1 (100/100, JAVA)
- 수학적인 계산..이 빛을 발한 구간
- 0과 1이 따로따로 더해진다면, 0의 카운트를 늘려서 1이나올때마다 0의 나온카운트를 더하는 식으로도 해결할 수 있다
CountDiv
https://app.codility.com/demo/results/trainingK7AEC2-7MY/ (50/100)
https://app.codility.com/demo/results/trainingYCH38D-RXC/ (75/100)
https://app.codility.com/demo/results/trainingPEYHB6-C2G/ (100/100)
https://app.codility.com/demo/results/trainingD5JVFC-726/?showingAll=1 (100/100, JAVA)
- 이것 역시 수학적인 계산
- 일반적으로 생각하는 방식으로 풀었다간 시간초과 오짐 (mod 이용)
- 시간 복잡도를 해결하려면 나머지 연산을 나눗셈으로 바꿀 수 있는 방법을 찾아야 함
GenomicRangeQuery
https://app.codility.com/demo/results/training8W6WQP-2HC/?showingAll=1 (100/100, JAVA)
- 하.. 푸는방법은 다양하겠지만, 정말 뭣같은 문제였다
- 맨처음에 O(N*M) 이 나오는데 시간복잡도에서 다꽝
- 결론은 O(N+M) 구조를 만들어야함
- 그러면 무조건, 공간복잡도에서 손해를 보던지 해서 산수로 결과를 내버려야됨
- 그래서 String 길이만큼의 배열을 만들고 Log 형식으로 숫자를 하나씩 더한다음에
- 범위 (A~B) 가 있으면 B-A 형식으로 빼서 최솟값을 구함
- 이런말은 좀 그렇지만 미친놈인줄 알았음
MinAvgTwoSlice
https://app.codility.com/demo/results/trainingU6662C-BGW/?showingAll=1 (100/100, JAVA)
- 평균은 최소 2가지의 숫자와 3가지의 숫자 이외에는 확률적으로 해당 평균보다 적게나오기가 힘듬
- 그래서 맨 처음에 2가지의 숫자의 평균을 각각 구해서 최소 평균과 최소 인덱스값을 저장해놓고
- 다음으로 3가의 숫자 평균을 구한다음에 위에서 구했던 최소 평균과 최소 인덱스를 또 비교
- 단, 평균값이기 때문에 항상 Double 로 진행해야 하는것은 Point!
Distinct
https://app.codility.com/demo/results/trainingUANE87-8XR/?showingAll=1
- 정렬문제라고 해서 정렬기법을 써야하나 싶었는데, 그냥 Set에 담아두고 Set.size 해주면 끝이였다.
MaxProductOfThree
https://app.codility.com/demo/results/training4YYGQ9-KWG/?showingAll=1 (44/100, JAVA)
https://app.codility.com/demo/results/trainingMU856E-XA5/?showingAll=1 (100/100, JAVA)
배열 중 임의의 3개의 숫자를 곱했을 때 가장 큰 결과값을 리턴하는 문제
음수도 포함되어 있기 때문에, 정렬 후 배열 오른쪽 맨 끝 3개의 곱과
배열 왼쪽 맨 끝 2개의 곱 * 배열 오른쪽 끝 1개를 곱해주는 것 중
비교해서 가장 큰 값을 리턴하면 된다.
Triangle
https://app.codility.com/demo/results/trainingG5GSZ7-27A/?showingAll=1 (93/100, JAVA)
https://app.codility.com/demo/results/trainingQ7A3VQ-XXB/?showingAll=1 (93/100, JAVA)
https://app.codility.com/demo/results/training32EUEM-BZC/?showingAll=1 (100/100, JAVA)
- Int 범위를 항상 생각할 것
- OverFlow 체크를 해야한다. 최댓값과 최댓값이 더해지면 OverFlow 되서 2가 출력되기 때문이다
NumberOfDiscIntersections
https://app.codility.com/demo/results/trainingP2ASWV-SFZ/?showingAll=1 (75/100, JAVA)
https://app.codility.com/demo/results/trainingQF2355-865/?showingAll=1 (100/100, JAVA)
- 이건 아직도 모르겠다
- 다른 방식을 찾아야 할듯?
- 일단 내가 참고한 Stack OverFlow
Nesting
https://app.codility.com/demo/results/trainingEK39ZR-S8H/?showingAll=1 (25/100, JAVA)
https://app.codility.com/demo/results/trainingXCRA3V-PSA/?showingAll=1 (100/100, JAVA)
- 스택으로 하는것은 맞으나, 여기서 하나 느낀 부분이 있다.
- 일단 split 함수는 시간복잡도가 굉장히 오래걸린다
- String 을 배열로 만드는것은 toCharArray 메서드를 사용해서 char 배열로 담는게 낫다.
- 아니면 toCharArray 와 forEach 문을 이용해서 바로 뽑아내도 되고
- 그리고 맨 마지막에 stack에 남아있는 것도 판별해주어야 한다.
Fish
https://app.codility.com/demo/results/trainingT2BUYU-W98/?showingAll=1 (0/100, JAVA)
https://app.codility.com/demo/results/trainingCNHX79-PMV/?showingAll=1 (100/100, JAVA)
- 한쪽의 케이스를 Stack에 담고 비교
- 문제의 조건을 잘 이해하고 그 때에 맞춰서 조건을 감소시키거나 증가시켜줄 것
- 물고기가 일단 하류로 간다고 해서(Stack에 넣으면 일단 물고기가 증가된 것임)
Brackets
https://app.codility.com/demo/results/trainingUZD2GE-5QB/?showingAll=1 (62/100, JAVA)
https://app.codility.com/demo/results/trainingDG93SA-MQ7/?showingAll=1 (100/100, JAVA)
- 해당 문제도 Stack을 이용하면 간단하게 풀리는 문제
- 조건들을 검사한 후 항상 마지막에 Stack에 데이터가 남아있는지 판별할 것
StoneWall
https://app.codility.com/demo/results/trainingXJQGM5-NS7/?showingAll=1 (100/100, JAVA)
- 해당 문제는 벽돌을 세울 때 최소한의 벽돌 갯수를 구하는 것인데
- 처음에 문제를 이해하기 너무 힘들었다
- 이런 문제해결방식도 처음보고
- 자료구조는 Stack 을 해결은 크기비교를 이용해서 답을 산출한다.
- 이런 방식은 비슷한 문제가 나왔을 때 외워둬야할 듯
Leader
EquiLeader
https://app.codility.com/demo/results/trainingYCZ4HS-J2J/?showingAll=1 (100/100, JAVA)
- 해당 문제는 가장 많이 나온 Leader 의 숫자를 가지고 비교하는 방법인데..
- 도저히 모르겠다. 한국인 해설이 없어서 내가 알아보기 쉬운 코드를 가지고 디버깅 돌리면서 이해해보려고 해도 안된다
- 수학적인 지식이 부족한것일까
- counterOfrLeaderInLeft > (i/2) && counterOfrLeaderInRight > (A.length-i) / 2 이 조건이 어떻게 나오는것인지 모르겠다
Dominator
https://app.codility.com/demo/results/training2654VA-W97/?showingAll=1 (66/100, JAVA)
https://app.codility.com/demo/results/training73CYRM-HZY/?showingAll=1 (75/100, JAVA)
https://app.codility.com/demo/results/training5BZSQ2-P8D/?showingAll=1 (100/100, JAVA)
- 가장 많이 나오는 숫자를 찾는 것
- 근데 이것이 배열의 길이를 2로 나눈것보다 작거나 같으면 Dominator 이 될 수 없음
- 이 부분만 고려해서 코드를 작성하면 됨
- hashMap 을 통해서 구현하였음
Maximum slice problem
MaxSliceSum
https://app.codility.com/demo/results/trainingMY3MRM-BBM/?showingAll=1 (7/100, JAVA)
https://app.codility.com/demo/results/trainingNG2MBP-9GB/?showingAll=1 (23/100, JAVA)
https://app.codility.com/demo/results/trainingJTXNCZ-E7H/?showingAll=1 (30/100, JAVA)
https://app.codility.com/demo/results/training3N4YWW-CTS/?showingAll=1 (53/100, JAVA)
https://app.codility.com/demo/results/trainingPBATHS-SSE/?showingAll=1 (61/100, JAVA)
https://app.codility.com/demo/results/trainingWQ2425-DZA/?showingAll=1 (100/100, JAVA)
- 처음에 간단하게 풀 수 있을줄 알았던 문제
- Pair 끼리만 비교하면 되는것인줄 알았는데, 전부 비교해야함
- 그래서 경우의수가 굉장히 복잡해지는 줄 암
- 하지만 2개의 변수를 잘 이용하면 간단하게 풀리는 문제
- 0부터 배열의 끝까지 계속 누적한 값과, 현재의 배열값을 비교
- 다른 변수에는 반복문이 돌고나서 계산결과가 끝났을 때 가장 큰 값을 기록한다
- 마지막으로 큰 값을 리턴
MaxProfit
https://app.codility.com/demo/results/trainingWED977-PXG/?showingAll=1 (88/100, JAVA)
https://app.codility.com/demo/results/trainingU7CPYD-DD4/?showingAll=1 (100/100, JAVA)
- 변수를 2개 활용
- 최소한의 값을 기억하고 있는
nMin
변수를 사용 - 그리고 인덱스가 높은 배열에서
nMin
변수를 빼면서 가장 큰 차액 데이터를 보관함 - 배열을 다 돌면 리턴
- 간단하죠?
MaxDoubleSliceSum
https://app.codility.com/demo/results/trainingW7BRFA-W9W/?showingAll=1 (100/100, JAVA)
- 3개의 슬라이스 포인트를 잡고, 해당 인덱스의 값은 뺀 후 사이값만 더해서 최댓값을 알아내는 것인데
- 왼쪽부터 시작하고 하나씩 더해서 최댓값의 배열을 만들고
maxLeft
- 오른쪽부터 시작하고 하나씩 더해서 최댓값의 배열을 만든다
maxRight
- 서로 다른 값들을 가진 배열이 나온다. 단 0보다 큰 데이터가 들어갈 수 있도록
Math.max
로 판별한다. - 그리고 왼쪽과 오른쪽에 대한 인덱스 차이가 2씩 나므로 X,Y,Z 가 예를들어 1,2,3 이면 1과3은 2차이
- Y 를 포인트로 잡고 maxLeft 는 -1 maxRight 는 +1 해서 최댓값을 구한다.
Prime and composite numbers
CountFactors
https://app.codility.com/demo/results/trainingHM7YNM-AJ3/?showingAll=1 (14/100, JAVA)
https://app.codility.com/demo/results/training8H6PRJ-ZV2/?showingAll=1 (100/100, JAVA)
- 약수 구하기다.
이건 문제이해가 안되서다른 사람 코드를 참고했다.- Math.sqrt 메서드도 알 수 있게되었고
- 약수를 일반적인 O(N)의 방식대로 풀면 시간초과가 나므로
- O(sqrt(N))정도로 줄여야한다
MinPerimeterRectangle
https://app.codility.com/demo/results/trainingX9HGQ6-J9Q/?showingAll=1 (100/100, JAVA)
- 1번 문제를 풀었다면 쉽게 풀 수 있는 문제
- sqrt 가 굉장히 유용하다
- 쉬운 문제였다
- 시간복잡도
O(sqrt(N))
Flags
Sieve of Eratosthenes
Euclidean algorithm
ChocolatesByNumbers
https://app.codility.com/demo/results/trainingW94HVG-JDR/?showingAll=1 (25/100, JAVA)
https://app.codility.com/demo/results/trainingH6ABRA-BNU/?showingAll=1 (66/100, JAVA)
https://app.codility.com/demo/results/trainingNUXS8F-U8Q/?showingAll=1 (100/100, JAVA)
- 유클리드 알고리즘을 사용하였다 (최대공약수를 구하는 알고리즘)
- 뭐 뒤에 나누는것은 처음 알았지만
- while 문 안에서 나머지 연산을 구한 후, swap
- while 문 탈출 조건은 N % M == 0 일 경우
Fibonacci numbers
Binary search algorithm
Caterpillar method
AbsDistinct
https://app.codility.com/demo/results/trainingZ5WHXB-QYD/?showingAll=1 (100/100, JAVA)
Greedy algorithms
Dynamic programming