Given a directory, implement a method that returns the count of encrypted and unencrypted files under the input directory.
public class Directory
{
public string Name { get; set; }
public Dictionary<string, Directory> Directories { get; set; }
public Dictionary<string, File> Files { get; set; }
public Directory(string name)
{
Name = name;
Directories = new Dictionary<string, Directory>();
Files = new Dictionary<string, File>();
}
public void AddChild(Directory child)
{
Directories[child.Name] = child;
}
public void AddChild(File file)
{
Files[file.Name] = file;
}
}
public class File
{
public string Name { get; set; }
public bool IsEncrypted { get; set; }
public File(string name, bool isEncrypted = true)
{
Name = name;
IsEncrypted = isEncrypted;
}
}
FOLLOW-UP:
There are two external APIs provided:
Let's say, requestTime is the time taken to make a request and fileEncryptTime is time taken to encrypt a file. So, total time to encrypt a file is essentially, requestTime + fileEncryptTime.
N = number of files (both unencrypted and encrypted)
So, total time to encrypt a directory is requestTime + N * fileEncryptTime.
Implement GetMinimumEncryptTime(requestTime, fileEncryptTime) which gives the least amount of time needed to encrypt all files in a directory.
Example:
/
-- dir1
------ file1 => True
------ file2 => False
-- dir2
------ file1 => False
------ file2 => TrueTest 1: requestTime = 3, fileEncryptTime = 1
Encrypting directory here is cheap.
- encrypt("/") => requestTime + (4 x fileEncryptTime) = 7
- total = 7
Test 2: requestTime = 2, fileEncryptTime = 2
Encrypting files here is cheap
- encrypt("/dir1/file2") => requestTime + (1 x fileEncryptTime) = 4
- encrypt("/dir2/file1") => requestTime + (1 x fileEncryptTime) = 4
- total = 8
encrypt("/") would have been costlier for Test 2, i.e. 2 + (2 * 4) = 10