# Minimum amount of lamps needed to be installed

Given a string containing only dots and asterisk. A dot represents free spaces and represents lamps. A lamp at position can spread its light at locations **i-1, i and i+1**. Determine the minimum number of lamps needed to illuminate the whole string.

**Examples:**

Input:str = “……”

Output:2

There are initially no lamps so the whole string is in dark.We will install lamps at position 2 and 5.The lamp at position 2 will illuminate 1, 2, 3 and lamp at position 5 will illuminate 4, 5, 6 thus the whole string is illuminated.

Input:str = “*.*”

Output:0

**Approach:** If we don’t have any asterisk then for each 3 dots we need one lamp, so the answer is **ceil(D/3)** where D is the number of dots. The problem can be solved by creating a copy of the given string, and for each asterisk in the first string we place an asterisk at it’s adjacent indices in the second string.

So if the given string is **“…**..”** then the second string will be **“..****.”**.

After that, we count the number of dots in each block of consecutive dots and find the number of needed lamps for that block, For each block the answer will be **ceil(D/3)** and the total sum of these lamps will be the answer for the complete string.

Below is the implementation of the above approach:

`# Python3 implementation of the above approach ` `import` `math ` ` ` `# Function to print minimum amount ` `# of lamps needed to be installed ` `def` `check(n, s): ` ` ` ` ` `# Create the modified string with ` ` ` `# v[i-1] = v[i + 1] = * where s[i] = * ` ` ` `v ` `=` `[""] ` `*` `n ` ` ` `for` `i ` `in` `range` `(n): ` ` ` `if` `(s[i] ` `=` `=` `"*"` `): ` ` ` `v[i] ` `=` `"*"` ` ` ` ` `# Checking valid index and then replacing ` ` ` `# "." with "*" on the surrounding of a * ` ` ` `if` `(i > ` `0` `and` `i < n ` `-` `1` `): ` ` ` `v[i ` `+` `1` `] ` `=` `"*"` ` ` `v[i ` `-` `1` `] ` `=` `"*"` ` ` `if` `(i ` `=` `=` `0` `and` `n !` `=` `1` `): ` ` ` `v[i ` `+` `1` `] ` `=` `"*"` ` ` `if` `(i ` `=` `=` `n ` `-` `1` `and` `n !` `=` `1` `): ` ` ` `v[i ` `-` `1` `] ` `=` `"*"` ` ` `else` `: ` ` ` ` ` `# Just copying if the character is a "." ` ` ` `if` `(v[i] !` `=` `"*"` `): ` ` ` `v[i] ` `=` `"."` ` ` ` ` `# Creating the string with the list v ` ` ` `xx ` `=` `''.join(v) ` ` ` ` ` `# Splitting the string into blocks ` ` ` `# with "*" as delimiter ` ` ` `x ` `=` `xx.split(` `"*"` `) ` ` ` `s ` `=` `0` ` ` `for` `i ` `in` `range` `(` `len` `(x)): ` ` ` ` ` `# Continuing if the string length is 0 ` ` ` `if` `(x[i] ` `=` `=` `""): ` ` ` `continue` ` ` ` ` `# Adding number of lamps for each block of "." ` ` ` `s ` `+` `=` `math.ceil(` `len` `(x[i]) ` `/` `3` `) ` ` ` `print` `(s) ` ` ` `# Driver code ` `s ` `=` `"......"` `n ` `=` `len` `(s) ` `check(n, s) ` |

*chevron_right*

*filter_none*

**Output:**

2

## Recommended Posts:

- Minimum number of letters needed to make a total of n
- Minimum number of Appends needed to make a string palindrome
- Minimum number of bracket reversals needed to make an expression balanced
- Minimum number of bracket reversals needed to make an expression balanced | Set - 2
- Least number of manipulations needed to ensure two strings have identical characters
- Number of closing brackets needed to complete a regular bracket sequence
- Minimum number of bombs
- Minimum Word Break
- Minimum Distance Between Words of a String
- Lexicographically minimum string rotation | Set 1
- Form minimum number from given sequence
- Minimum cost to modify a string
- Minimum insertions to form a palindrome | DP-28
- Minimum cost to construct a string
- Minimum number of stops from given path

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.