# How To Approach A Coding Problem ?

• Difficulty Level : Easy
• Last Updated : 25 Jan, 2023

Solving a DSA (Data Structures and Algorithms) Problem is quite tough. In This article, we help you not only solve the problem but actually understand it, It’s not about just solving a problem it’s about understanding the problem. we will help to solve DSA problems on websites like Leetcode, CodeChef, Codeforces, and Geeksforgeeks. the importance of solving a problem is not just limited to job interviews or solve problems on online platform, its about develop a problem solving abilities which is make your prefrontal cortex strong, sharp and prepared it to solve complex problem in future, not only DSA problems also in life.

These steps you need to follow while solving a problem:

– Understand the question, read it 2-3 times.
– Take an estimate of the required complexity.
– find, edge cases based on the constraints.
– find a brute-force solution. ensure it will pass.
– Optimize code, ensure, and repeat this step.
– Dry-run your solution(pen& paper) on the test cases and edge cases.
– Code it and test it with the test cases and edge cases.
– Submit solution. Debug it and fix it, if the solution does not work.

### Understand The Question

firstly read it 2-3 times, It doesn’t matter if you have seen the question in the past or not, read the question several times and understand it completely. Now, think about the question and analyze it carefully. Sometimes we read a few lines and assume the rest of the things on our own but a slight change in your question can change a lot of things in your code so be careful about that. Now take a paper and write down everything. What is given (input) and what you need to find out (output)? While going through the problem you need to ask a few questions yourself…

1. Did you understand the problem fully?
2. Would you be able to explain this question to someone else?
3. What and how many inputs are required?
4. What would be the output for those inputs
5. Do you need to separate out some modules or parts from the problem?
6. Do you have enough information to solve that question? If not then read the question again or clear it to the interviewer.

### Estimate of the required complexity

Look at the constraints and time limit. This should give you a rough idea of the expected time and space complexity. Use this step to reject the solutions that will not pass the limits. With some practice, you will be able to get an estimate within seconds of glancing at the constraints and limits.

### Find, edge cases

In most problems, you would be provided with sample input and output with which you can test your solution. These tests would most likely not contain the edge cases. Edge cases are the boundary cases that might need additional handling. Before jumping on to any solution, write down the edge cases that your solution should work on. When you try to understand the problem take some sample inputs and try to analyze the output. Taking some sample inputs will help you to understand the problem in a better way. You will also get clarity that how many cases your code can handle and what all can be the possible output or output range.

Constraints

0 <= T <= 100

1 <= N <= 1000

-1000 <= value of element <= 1000

### Find a brute-force Solution

A brute-force solution for a DSA (Data Structure and Algorithm) problem involves exhaustively checking all possible solutions until the correct one is found. This method is typically very time-consuming and not efficient, but can be useful for small-scale problems or as a way to verify the correctness of a more optimized solution. One example of a problem that could be solved using a brute-force approach is finding the shortest path in a graph. The algorithm would check every possible path until the shortest one is found.

### Break Down The Problem

When you see a coding question that is complex or big, instead of being afraid and getting confused that how to solve that question, break down the problem into smaller chunks and then try to solve each part of the problem. Below are some steps you should follow in order to solve the complex coding questions…

• Make a flow chart or a UML for the problem at hand.
• Divide the problem into sub-problems or smaller chunks.
• Solve the subproblems. Make independent functions for each subproblem.
• Connect the solutions of each subproblem by calling them in the required order, or as necessary.
• Wherever it’s required use classes and objects while handling questions (for real-world problems like management systems, etc.)

Always try to improve your code. Look back, analyze it once again and try to find a better or alternate solution. We have mentioned earlier that you should always try to write the right amount of good code so always look for the alternate solution which is more efficient than the previous one. Writing the correct solution to your problem is not the final thing you should do. Explore the problem completely with all possible solutions and then write down the most efficient or optimized solution for your code. So once you are done with writing the solution for your code below are some questions you should ask yourself.

Optimizing a solution in DSA (Data Structure and Algorithm) refers to improving the efficiency of an algorithm by reducing the time and/or space complexity. This can be done by using techniques such as dynamic programming, greedy algorithms, divide and conquer, backtracking, or using more efficient data structures.

It’s important to note that the optimization process is not always straightforward and it can be highly dependent on the specific problem and constraints. The optimization process usually starts with a brute force approach, and then various techniques will be applied to make the algorithm more efficient. The optimization process will often require a trade-off between time and space complexity.

Also, measuring and analyzing the performance of the algorithm is an essential step in the optimization process. The use of mathematical notation and analysis tools like Big O notation and complexity analysis, can help to understand the performance of an algorithm and decide which one is the best.

• Does this code run for every possible input including the edge cases.
• Is there an alternate solution for the same problem?
• Is the code efficient? Can it be more efficient or can the performance be improved?
• How else can you make the code more readable?
• Are there any more extra steps or functions you can take out?
• Is there any repetition in your code? Take it out.

Below is the alternate solution for the same problem of the array which returns even numbers…

function getEvenNumbers(arrayofNumbers) {
let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)
return evenNumbers
}

Dry-running a solution on test cases and edge cases involves manually going through the steps of the algorithm with sample inputs and verifying that the output is correct. This process can help to identify any bugs or errors in the code, as well as ensure that the algorithm is correctly handling all possible inputs, including edge cases.

When dry-running your solution, it’s important to consider both the expected test cases and any unexpected edge cases that may arise. Edge cases are inputs that are at the boundaries of the problem’s constraints, for example, the maximum or minimum values.

To dry-run the solution, you will need to:

• Write down the sample test case inputs and expected outputs.
• Go through the steps of the algorithm manually, using the test case inputs.
• Compare the output of the algorithm to the expected output, to ensure the solution is correct.
• Repeat the process for each test case and edge case.
• Dry-running your solution on test cases and edge cases can help you to identify any issues with your algorithm, and make any necessary adjustments before running the code on a computer.

### Code & Test it On Edge Cases

After dry-running your solution and verifying that it is right, the next step is to code it and test it using the test cases and edge cases.

To code the solution, you will need to:

•  write the code for the algorithm.
• Make sure to include any necessary data structures and methods.
• Test the code with sample inputs, including the test cases and edge cases that were used during the dry-run.
• When testing the code, it’s important to not only check for the expected outputs, but also for any unexpected behavior or errors. Testing with edge cases is especially important as it can reveal bugs or errors that might not be present in other test cases.

It’s also a good practice to test the code with additional test cases and edge cases, to further ensure the correctness and robustness of the solution.

Once the code has been tested and all the bugs have been fixed, you can submit it.

### Submit solution

After coding and testing the solution on the sample test cases, the next step is to submit it, usually to a platform for review or for a contest.

The submission process can depending on the platform, but basically it involves submitting the code and any necessary documentation. After the submission, the solution is usually reviewed by other participants or judges, and feedback is provided on whether the solution is correct or if there are any errors. If the solution is wrong or does not work as expected, the next step is to debug and fix it. Debugging is the process of identifying and resolving errors in the code. This can involve using tools such as a debugger, print statements, or logging to find the source of the problem.

Once the error has been identified, the next step is to fix it. This can involve making changes to the code, data structures, or algorithms used. Once the changes have been made, it’s important to test the solution again to ensure that the error has been resolved and that the solution is correct.

If the solution is correct, you can submit it again or move on to other problems.

It’s important to note that the debugging and fixing process can be an iterative one and it may take several iterations to get the solution working correctly.

My Personal Notes arrow_drop_up