2019년 1월 26일 토요일

#10 알고리즘 연습 - 두 정수 사이의 합 - JAVA


두 정수 사이의 합


문제 설명

두 정수 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의 대소관계는 정해져있지 않습니다.
입출력 예
abreturn
3512
333
5312




문제풀이 IDEA

a부터 b까지의 list를 만들어서 list의 element들을 더해주면 되겠다.

이때 list가 주어졌을때 sum의 값을 출력해주는 함수가 있었으면 좋겠다.

그런데 이 방법은 사실 for문에 +=를 이용하는것보다 복잡하고 안좋은 방법같다.
(괜히 복잡하게 풀려했는지도 모르겠지만 stream의 기능에 대해서 이해하고 넘어간다 생각하자)



나의 코드⭐

2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.*; 

class Solution {
  public long solution(int a, int b) {
      ArrayList<Integer> list = new ArrayList<Integer>();   //a부터 b까지의 숫자를 더해야 하므로 a부터 b까지를 가지고 
                                                             있는 List를 만들어 주기위해서 ArrayList를 사용해준다
          
      for (int i = 0 ; i < Math.max(a,b)-Math.min(a,b)+1; i++){   //반복문을 이용할때 a,b중 
          list.add(Math.min(a,b)+i);                                (큰 정수 - 작은 정수 +1)번 만큼 돌아야하므로
                                                                     
      }
      return list.stream().mapToInt(i -> i).sum();                //stream은 반복문의 사용대신 list를 탐색해주고
  }                                                                 mapToint는 각각의 요소에 대하여 int형의 stream으로
}                                                                   return해주는데 sum을 이용하여 stream의 합을 출력


다른 코드1(for과 +=를 이용한 기본적 덧셈) ⭐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
  public long solution(int a, int b) {
      long answer = 0;
          for(int i=Math.min(a,b);i<=Math.max(a,b);i++){    //나의 방법과 같은데 표기법만 다르게
              answer+=i;                                      작은수부터 큰수보다 작거나 같을때까지 돌림
          }
      return answer;
  }
}


다른 코드2 (덧셈공식 이용) ⭐

1
2
3
4
5
6
7
8
9
10
11
class Solution {

    public long solution(int a, int b) {
        return sumAtoB(Math.min(a, b), Math.max(b, a));  //함수를 2개를 사용했는데 SumAtoB라는 함수에
    }                                                      작은수를 첫번째 인자로 큰수를 두번째 인자로 전달해준다

    private long sumAtoB(long a, long b) {
        return (b - a + 1) * (a + b) / 2;                  //long a, long b를 인자로 받아서 a부터 b까지의 합 덧셈공식
    }                                                        a~b 까지의 sum은 
                                                             (first ele + last ele)*(number of first to last)
}





살짝 더 알아 보자



stream().mapToInt()



mapToInt (str -> str.length())

list내 str의 값을 읽어와 int값인  str.length로 리턴해준다


mapToInt(num -> Integer.parseInt(num))

list내 num의 값이 string으로 저장되어 있다고 해도 해당값을 int로 바꿔서 return해준다




고등학교때까지 배운 덧셈 공식과 같은 편리한 수학공식을 적용하자



꼭 하나의 함수로만 구현할 필요없다.


출처:https://programmers.co.kr

댓글 없음:

댓글 쓰기

가장 많이 본 글