TIL

2023/11/21 TIL

미역제자 2023. 11. 21. 20:29


오늘도 알고리즘 문제 중에서 한가지를 가져와봤다.

 

문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

 

제한 조건

  • a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
  • a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
  • a와 b의 대소관계는 정해져있지 않습니다

처음 생각했던 방법은 다음과 같다.

public class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        int count = b - a + 1; 
        answer = (long)(a + b) * count / 2;
        return answer;
    }
}

 

근데 문제는 b보다 a가 작은 경우는 이상없이 풀렸지만 a가 b보다 더 큰경우에는 b-a가 음수로 나와서 a와 b사이의 정수 개수를 셀 수 없었다.

 

그래서 절댓값을 구해주는 메서드를 사용해보려고 했다.

바로 Math.Abs이다.

https://learn.microsoft.com/ko-kr/dotnet/api/system.math.abs?view=net-7.0

 

Math.Abs 메서드 (System)

지정된 숫자의 절대 값을 반환합니다.

learn.microsoft.com

Math.Abs(value)를 사용하면 value값의 절댓값을 반환하게 된다.

따라서 이 메서드를 사용하면 위의 코드에서 b-a의 절댓값을 구할 수 있다.

public class Solution {
    public long solution(int a, int b) {
        long answer = 0;
        int count = Math.Abs(a - b) + 1; 
        answer = (long)(a + b) * count / 2;

        return answer;
    }
}

 

하지만 이렇게 코드를 작성하면?

/Solution0.cs(4,21): error CS0103: The name `Math' does not exist in the current context

 

오류가 발생한다.

왜 그런지 살펴봤더니 using System;이 빠져있어서 그렇다고 한다.

 

추가했더니 잘 되는 모습이다.

테스트 1
입력값 3, 5
기댓값 12
실행 결과 테스트를 통과하였습니다.
테스트 2
입력값 3, 3
기댓값 3
실행 결과 테스트를 통과하였습니다.
테스트 3
입력값 5, 3
기댓값 12
실행 결과 테스트를 통과하였습니다.
테스트 4
입력값 8, 11
기댓값 38
실행 결과 테스트를 통과하였습니다.
테스트 5
입력값 7, 10
기댓값 34
실행 결과 테스트를 통과하였습니다.
테스트 결과 (~˘▾˘)~
5개 중 5개 성공

 

그러면 다른 방법은 없는가?

절댓값을 구하지 않고, a와 b의 크기를 비교해서 굳이 절댓값을 구할 필요가 없게 만들면 되는것 아닐까?

 

그래서 3항연산자를 사용해서 코드를 만들어보았다.

public class Solution {
    public long solution(int a, int b) {
        long answer = 0;

        int start = (a < b) ? a : b; 
        int end = (a < b) ? b : a; 

        int count = end - start + 1; 
        answer = (long)(start + end) * count / 2;

        return answer;
    }

 

이렇게 만들면 작은값을 start에, 큰 값을 end에 넣어서 굳이 절댓값을 안구해도 문제를 풀 수 있다.

 

'TIL' 카테고리의 다른 글

2023/11/23 TIL  (0) 2023.11.23
2023/11/22 TIL  (1) 2023.11.22
2023/11/20 TIL  (0) 2023.11.20
2023/11/17 TIL  (0) 2023.11.17
2023/11/16 TIL  (0) 2023.11.16