중간에 이미 완성되어 있는 부분은 최대한 건드리지 않고, 이외의 부분만 수정해보자
--> 이미 완성되어 있는 부분은 색칠해봄
뒤집어도 올바른 괄호문자열이다
올바른 괄호 문자열은 뒤집어도 어차피 영향을 받지 않으므로, 올바른 문자열은 지우고 연산해도 무관하다.
))))()(((
이런 경우일 경우, 올바른 괄호문자열로 ()이 빠진다.
STACK
여는 괄호는 다 스택에 push,
닫는 괄호가 나오면
1. 스택에 원소가 있으면 pop
2. 아니면 변형
가장 작은 최종 속력은 -> 가장 작은 최종 속력을
마지막에 속력값이 가장 최소로 나오게끔 하는 레일을 배치하면 될까?
실제로 배치 방법을 정하고 값을 구하는 것 자체가 불가능!! (가짓수가 너무 많다)
i는 1~(n-1)까지 다 만족하는 수
분자가 0이 될 수 있는데, 상관없고 그냥 내림차순 정렬해주면 된다.
정렬방법은 마음대로 - 선택정렬, 삽입정렬, 병합정렬, 힙정렬, ...
주어진 배열에서 요소들 간의 잘 정의된 순서(Cycle이 없는 순서)가 있으면 두 요소 사이의 비교식을 통해 전체를 정렬할 수 있다. ( ((ai+1) - 1)bi <= ((ai -1)(bi+1) )
누적합 배열 사용!!
시간복잡도 : O(n)
여기서, 최솟값을 이미 찾아놨는데 R이 하나 늘어난다면 처음부터 해당범위까지 최솟값을 구하는 연산을 다시 해야함 --> 중복!!
최솟값을 찾는 과정을 더 개선해보자
시간복잡도 : O(n)
빡센 구현문제
• S의 최대 길이 : 100,000
해시충돌이 필연적이다. 최대한 문자열이 다르면 결과값이 다를 확률을 높이는 형태. 같으면 같다고 믿자.
위 연산을 사용해도 나머지는 동일하다. (나눗셈만 하지 않으면 나머지는 동일하다)
길이문제 -> 판정문제로 변형
Yes -> 길이 반환
No -> -1 반환
X -> 그보다 긴 길이는 모두 불가능
O -> 그보다 작은 길이 모두 가능
1. 개수 세기
2. 누적합 구하기
3. 역순으로 자리지정하기
(이전에 정리했던 파일 보기)
: 문자열의 모든 접미사를 모아 정렬한 배열