개발 여정/코딩테스트 준비
HackerRank 1달 과정 1주차 7번- Diagonal Difference
calm-lee
2021. 12. 21. 19:13
정사각 매트릭스 형태로 구성된 int들이 주어지면
이를 각 대각선 순서로 더한다.
왼쪽 오른쪽 합을 따로 구한 뒤, 두 합의 차를 구해야 한다. (음수이면 양수로 전환)
class Result {
public static int diagonalDifference(List<List<Integer>> arr) {
int n = arr.size(); // 파라미터로 주어지는 List의 size
int dia1 = 0; // 왼쪽 대각선 합
int dia2 = 0; // 오른쪽 대각선 합
int answer = 0; // 답
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i == j){ // 왼쪽 대각선인 경우, i==j가 같아야 한다.
dia1 += arr.get(i).get(j); // 이중 list이므로 get().get()으로 값을 불러온다.
} if (i + j == (n-1)){ // 오른쪽 대각선인 경우 i+j의 합이 arr.size()보다 1 작다. i==j인 경우도 포함하므로 else if를 쓰면 안된다.
dia2 += arr.get(i).get(j);
}
}
}
answer = dia1 - dia2 > 0 ? dia1 - dia2 : -(dia1 - dia2); // 삼항연산자로 양수의 차이를 구한다.
return answer;
}
}
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
int n = Integer.parseInt(bufferedReader.readLine().trim());
List<List<Integer>> arr = new ArrayList<>();
IntStream.range(0, n).forEach(i -> {
try {
arr.add(
Stream.of(bufferedReader.readLine().replaceAll("\\s+$", "").split(" "))
.map(Integer::parseInt)
.collect(toList())
);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
});
int result = Result.diagonalDifference(arr);
bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
한 인도 유저가 반복문 하나로 간단하게 푼 풀이 (solution class는 같으므로 생략)
class Result {
public static int diagonalDifference(List<List<Integer>> arr) {
int diagonalSum=0;
int antiDiagonalSum=0;
for(int i=0;i<arr.size();i++){
diagonalSum += arr.get(i).get(i);
antiDiagonalSum += arr.get(i).get(arr.size() - i - 1);
}
int diff = diagonalSum-antiDiagonalSum;
return Math.abs(diff); // Math.abs() : 절대값을 반환하는 함수
}
}