본문 바로가기

Medium174

[leetcode][1319] Number of Operations to Make Network Connected 문제 : https://leetcode.com/problems/number-of-operations-to-make-network-connected/ 컴퓨터의 총 개수와 네트워크 연결 여부를 저장한 배열이 주어졌을 때, 모든 컴퓨터들이 네트워크에 연결하기 위해 이동이 필요한 네트워크 연결 수 를 반환하는 문제. (불가능하다면 -1) 최소 신장 트리의 간선 수는 N-1개이다. 비슷하게 이 문제에서 불가능한 네트워크 개수는 컴퓨터의 총 개수 - 1 보다 작은 경우들이다. 이 경우를 만족한다면 모든 컴퓨터들이 네트워크에 연결이 가능하다. Union-Find를 이용해서 네트워크 번호를 하나의 배열에 저장한다. 즉, a, b 컴퓨터가 같은 네트워크에 있다면 배열[a], 배열[b]는 같은 값을 가진다. 네트워크 배열.. 2020. 3. 7.
[leetcode][79] Word Search 문제 : https://leetcode.com/problems/word-search/ 2차원 문자 배열, 단어가 주어지면 배열에 단어의 유무를 리턴하는 문제. 신문 단어 퍼즐 같은 문제. DFS로 풀었다. 문자열 배열을 탐색하면서 탐색중인 인덱스를 시작 위치로 하여 단어가 있는지 판단한다. // board: 2차원 문자 배열 // word : 찾는 단어 // board[x][y]를 시작 위치로 하여 word가 있는지 find(board, x, y, word): // 경계 체크 if(x, y 이미 방문) return false if(board[x][y]와 word의 첫 번째 문자가 같지 않다면) return false ans = false x, y 방문 체크 for(nx, ny = 상, 하, 좌, 우 이동.. 2020. 3. 7.
[hackerrank] Sherlock and Anagrams 문제 : https://www.hackerrank.com/challenges/sherlock-and-anagrams/problem 입력 문자열의 부분문자열들 중 애너그램 문자열이 되는 문자열 pair 개수를 구하는 문제. 애너그램이 될 수 있는 문자열들은 길이가 서로 같아야 하므로 먼저 길이가 같은 부분 문자열들을 구한다. 그리고 구한 부분 문자열을 오름차순 정렬한뒤 map에 저장한다. map의 key는 정렬된 문자열이고 value는 key가 나온 횟수이다. 즉, "mom"이 입력 문자열로 주어지고 길이가 2인 부분 문자열을 구했을 때, ["mo", "om"] 이 나오고 각 문자열들을 오름차순 정렬하면 ["mo", "mo"] 가 된다. 이를 map에 넣으면 map에는 1개의 요소가 저장되고 이는 "mo".. 2020. 2. 16.
[leetcode][1329] Sort the Matrix Diagonally 문제 : https://leetcode.com/problems/sort-the-matrix-diagonally/ 입력으로 받은 배열의 대각선 요소들을 오름차순 정렬한 뒤 반환하는 문제 최소힙으로 풀었다. 대각선 요소들을 하나의 힙에 넣어야 한다. 인덱스 0 1 2 3 0 2 3 4 5 1 1 2 3 4 2 0 1 2 3 3x4 배열의 대각선 인덱스를 구하면 위와 같다. (구현에 따라 달라질 수 있음) 대각선 배열의 최대 크기는 n+m-1 이다. (m: 행, n: 열) mat[i][j]의 대각선 인덱스는 i+j-m-1 이다. 위 표를 보았을 때 열의 가장 아래부터 시작하기 때문에 m을 빼주었다. 1은 인덱스는 0부터 시작하기 때문에 뺐다. 따라서 n+m-1 개의 최소 힙을 배열에 저장한뒤, mat 배열을 .. 2020. 2. 15.
[hackerrank] Largest Pyramid 문제 : https://www.hackerrank.com/contests/hourrank-23/challenges/largest-pyramid/problem int arr[351][351]; //arr[i][j] : (i,j) 요소 값. (입력값) int max_down[400][351][351] = {0}; //max_down[size][i][j] : j열의 arr[i][j] 부터 arr[i+size-1][j] 중 최대 값 int max_right[400][351][351] = {0}; //max_right[size][i][j] : i행의 arr[i][j] 부터 arr[i][j+size-1] 중 최대 값 int sum[351][351] = {0}; //sum[i][j] : (1,1) ~ (i,j) 까지.. 2020. 2. 15.
[leetcode][368] Largest Divisible Subset 문제 : https://leetcode.com/problems/largest-divisible-subset/ 중복되지 않는 양수 정수 배열이 주어질 때, (A, B) pair가 A%B = 0 이거나 B%A = 0 인 경우, 즉, 나누어떨어지는 수들로만 이루어진 subset들 중 가장 긴 subset을 하나 구하는 문제이다. dp로 풀었다. dp[i] = 부분문자열[i~]에서 i 번째 정수를 반드시 포함하면서 조건에 만족하는 subset들 중 최장 길이. (길이를 저장) nextInd[i] = dp[i]가 저장될 때, 2번째로 저장되는 정수의 인덱스. (1번째는 i번째 정수로 고정). 나중에 subset 문자열을 구할 때 추적용도로 사용한다. 초기값은 -1 [1,2,4,5]을 예로 들어보자. 인덱스 0,1.. 2020. 1. 26.