본문 바로가기

알고리즘 문제408

[leetcode][1209] Remove All Adjacent Duplicates in String II 문제 : https://leetcode.com/problems/remove-all-adjacent-duplicates-in-string-ii/ {문자, 문자가 연속으로 나온 횟수}를 요소로 하는 stack을 하나 만든다. 문자열 s를 앞에서부터 탐색하면서 스택이 비어있거나 스택 top에 있는 요소의 문자가 탐색중인 문자와 같다면 top 요소의 문자가 연속으로 나온 횟수를 +1 해준다. 그리고 만약 스택 top의 연속 횟수가 k와 같다면 stack을 pop 시킨다. 모든 문자열 s를 탐색하면서 stack을 세팅했다면 stack을 pop하면서 정답 문자열 앞에 문자열을 추가하면서 정답을 구할 수 있다. 시간 복잡도는 O(N). (N = |s|) 소스코드 : https://github.com/fpdjsns/A.. 2019. 10. 3.
[leetcode][1207] Unique Number of Occurrences 문제 : https://leetcode.com/problems/unique-number-of-occurrences/ set, map을 사용. arr 배열을 탐색하면서 set에 arr[i]들을 저장한다. map은 arr[i]이 나온횟수를 저장하는 cnt, cnt의 value가 나온 횟수를 저장하는 num. 총 2개의 map을 준비한다. 즉, arr = { 1, 2, 2, 1, 1, 3, 2 } 이라면 cnt = { (1, 3), (2, 3), (3, 1) } num = { (1,1), (3, 2) } 이 된다. arr 배열을 탐색하면서 map1, map2개를 세팅한다. 그리고 num[i] = 1 이 되는 모든 i의 개수(uniqueNumCnt)를 구한다. 위 예제에서는 1이 된다. 만약 uniqueNumC.. 2019. 10. 2.
[leetcode][1190] Reverse Substrings Between Each Pair of Parentheses 문제 : https://github.com/fpdjsns/Algorithm/blob/master/leetcode/1190.%20Reverse%20Substrings%20Between%20Each%20Pair%20of%20Parentheses.cpp 스택을 사용했다. Example 3: "(ed(et(oc))el)" 을 예로들어보자. 여는 괄호가 시작될때마다 스택을 하나씩 생성해서 이후에 나오는 문자들을 최근 스택에 쌓는다. 스택이 하나도 없는 경우 문자열 순서에 변경이 없을 것이기 때문에 정답 문자열의 뒤에 추가한다. 닫는 괄호가 나오면 최근 스택을 pop하면서 이전 스택에 push한다. 스택을 pop할때 이전 스택이 없는 경우 (스택이 하나인 경우) 정답 문자열에 추가한다. 시간복잡도는 O(|s|^2).. 2019. 10. 1.
[leetcode][1189] Maximum Number of Balloons 문제 : https://leetcode.com/problems/maximum-number-of-balloons/ text문자열의 모든 문자를 탐색하면서 alph[문자] = 문자 나온 횟수 위 배열을 갱신한다. balloon은 a 1개, b 1개, l 2개, n 1개, o 2개로 이루어져있기 때문에 이 개수들을 모두 만족해야한다. 따라서 (alph[a] / 1), (alph[b] / 1), (alph[l] / 2), (alpha[n] / 1), (alpha[o] / 2) 중 최소값이 정답이 된다. 시간복잡도는 O(|text|). 소스코드 : https://github.com/fpdjsns/Algorithm/blob/master/leetcode/1189.%20Maximum%20Number%20of%20Bal.. 2019. 9. 25.
[leetcode][1202] Smallest String With Swaps 문제 : https://leetcode.com/problems/smallest-string-with-swaps/ 만약 [(1,3), (1,2)] 라는 pairs 배열이 입력으로 주어진다면 s[1], s[2], s[3] 에 있는 문자들은 direct로는 아니더라도 서로 change 할 수 있다. ex) (2, 3) 을 바꾸려면 (1, 3), (1,2) (1,3)을 바꾸면 (2,3)을 바꾼 결과가 된다. 따라서 Union-Find로 문제를 풀 수 있다. 모든 pairs를 탐색하면서 Union-Find로 한 다리 건너서라도 바꿀 수 있는 인덱스들을 그룹으로 묶는다. 같은 그룹은 속한 그룹의 s 문자열의 최소 인덱스를 가진다. 위 예제에서는 [[0], [1,2,3]] 으로 묶일 것이다. 그룹으로 다 묵었으면 k.. 2019. 9. 23.
[leetcode][1192] Critical Connections in a Network 문제 : https://leetcode.com/problems/critical-connections-in-a-network/ tarjan 알고리즘으로 풀었다. dfs로 정점들을 방문하면서 해당 정점을 방문한 순번(num)과 하나의 간선만으로 갈 수 있는 정점들 중 가장 작은 정점(low)을 저장하는 배열들을 저장한다. low 저장하는 조건. now = 현재 탐색중인 정점 next = now에서 방문할 다음 정점 1. next 정점을 이미 방문한 경우(back edge) : low[now] = min(low[now], low[next]) 2. next 정점을 아직 방문하지 않은 경우 : low[now] = min(low[now], num[next]). 2번인 경우 next 정점을 dfs로 방문하면서 low.. 2019. 9. 23.