I was solving a question on Codechef and I encountered this problem.
Here is the link to the question. https://www.codechef.com/LP0TO101/problems/FLOW013
Basically we are given three angles and we need to check if their sum is 180 and therefore it is a triangle, and if it is we need to print YES or else we need to print NO.
We are given input in the following format.
3
40 40 100
45 45 90
180 1 1
[Note: There is a blank string(" ") right after 3.]
This is my source code.
import java.util.Scanner;
import java.util.stream.IntStream;
class Codechef {
public static void main(String[] args) throws java.lang.Exception {
Scanner sc = new Scanner(System.in);
int T = Integer.parseInt(sc.nextLine().split(" ")[0]);
String[] output = new String[T];
while (--T >= 0) {
String arr[] = sc.nextLine().split(" ");
System.out.println("arr[0]: " Integer.parseInt(arr[0]));
System.out.println("arr[1]: " Integer.parseInt(arr[1]));
System.out.println("arr[2]: " Integer.parseInt(arr[2]));
if ((Integer.parseInt(arr[0]) Integer.parseInt(arr[1]) Integer.parseInt(arr[2])) == 180) {
output[T] = "YES";
} else {
output[T] = "NO";
}
}
IntStream.range(0, output.length).forEach(h -> System.out.println(output[h]));
}
}
The output it is returning on Codechef is:
arr[0]: 40
arr[1]: 40
arr[2]: 100
arr[0]: 45
arr[1]: 45
arr[2]: 90
arr[0]: 180
arr[1]: 1
arr[2]: 1
NO
YES
YES
What is wrong here, please help.
My question is how come arr[0]: 40 arr[1]: 40 arr[2]: 100 is not equal to 180, I mean 40 40 100 should be equal to 180, so what is wrong.
When in the Eclipse IDE I gave the input of:
1
40 40 100
It showed me output of:
arr[0]: 40
arr[1]: 40
arr[2]: 100
YES
But when I give the same output there, it doesn't executes fully and keeps processing while it is incomplete and shows me output of(I am inserting the image):
Note: The red square in the right corner of the image shows that it is still executing.
However when I have removed the printing statements and gave the same input in eclipse, it showed me an output of: (Inserting an image again)
I hope you have understood my problem.
My question again is how come arr[0]: 40 arr[1]: 40 arr[2]: 100 is not equal to 180, I mean 40 40 100 should be equal to 180, what is wrong. And when I am executing it individually it is showing me the right output but when I do the test case on Codechef it is showing the opposite answer.
What is wrong here?
CodePudding user response:
The variable T
runs "backwards"; it starts at - in the example - 2
and ends at 0
. Variable T
is also used to index the output
array. This means that:
output[2]
correlates with the 1st iteration (i.e. the input40 40 100
),output[1]
correlates with the 2nd iteration (i.e. the input45 45 90
), andoutput[0]
correlates with the 3rd iteration (i.e. the input180 1 1
).
Now we see that - in fact - the value of output[0]
(being "NO"
) is correct since 180 1 1 = 182 != 180
.
I rewrote the program such that the output
is stored in the order the values are calculates:
class Ideone {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = Integer.parseInt(sc.nextLine().split(" ")[0]);
String[] output = new String[num];
for (int index = 0; index < num; index) {
String arr[] = sc.nextLine().split(" ");
System.out.println("arr[0]: " Integer.parseInt(arr[0]));
System.out.println("arr[1]: " Integer.parseInt(arr[1]));
System.out.println("arr[2]: " Integer.parseInt(arr[2]));
if ((Integer.parseInt(arr[0]) Integer.parseInt(arr[1]) Integer.parseInt(arr[2])) == 180) {
output[index] = "YES";
} else {
output[index] = "NO";
}
}
System.out.println(Arrays.toString(output));
}
}
This then gives the output:
...
[YES, YES, NO]
Some remarks:
We should use descriptive names for variables (e.g.
String[] arr
could beString[] userInputs
)variable names should be writte in
lowerCamelCase
(int T = ...
->int t = ...
)Instead of parsing the
String
s over and over again, I would suggest to parse them once, and then - for example - store them in aList<Integer>
and work with them, e.g.:List<Integer> values = Arrays.stream(arr) .mapToInt(Integer::parseInt) .boxed() .toList();
While possible, it is uncommon to write the array-brackets (
[]
) after the variable name. We normally write them after the type since they influence the type (String arr[]
->String[] arr
).
CodePudding user response:
The loop iterates over --T
, and then you use T
as the array index for the result, meaning you're getting the results in reverse order. One way to solve this is to use a straight-up ascending for loop and use its index as the array index:
for (int i = 0; i < T; i) {
// The logic remains unchanged
String arr[] = sc.nextLine().split(" ");
System.out.println("arr[0]: " Integer.parseInt(arr[0]));
System.out.println("arr[1]: " Integer.parseInt(arr[1]));
System.out.println("arr[2]: " Integer.parseInt(arr[2]));
// i is used for the array index, not T
if ((Integer.parseInt(arr[0]) Integer.parseInt(arr[1]) Integer.parseInt(arr[2])) == 180) {
output[i] = "YES";
} else {
output[i] = "NO";
}
}
CodePudding user response:
you've assigned YES/NO into the array output
with a reserved sort.when you are using --T
the index of output
in loop was 2,1,0 so the values in output are ["NO","YES","YES]. that's why you get a wrong result.
You can change the while loop to a simple for loop.
for(int i=0;i<output.size;i
)` and assign YES/NO to output[i]