loading

알고리즘/알고리즘JAVA

[백준알고리즘/함수] 15596번 문제 : 정수 N개의 합(자바/JAVA)

침착곰 2021. 5. 8. 15:18
반응형

안녕하세요

백준 알고리즘 단계별로 풀어보기 6단계 함수를 풀어봤습니다

이번 문제는 지금까지의 제출 방식과는 많이 틀려서 문제를 처음 봤을 때 굉장히 당황했습니다;;

예제는 없고 어떤 언어로 제출하라는 문제밖에 없습니다

어떻게 제출하는거야!!!!

잠깐 멘붕이 왔다가 어쨋든 문제를 작성해서 제출을 하려고 눌러보니 어느정도 작성예시가 있어서 그것을 보고 문제를 풀었습니다 ㅎ

이번 함수 문제도 다양한 방식으로 풀고 싶었는데 문제가 단순해서 문법만 다르게해서 똑같은 방식으로 풀어봤습니다

이제 제가 풀은 방식에 대해서 설명하겠습니다!!

 


문제 링크입니다

www.acmicpc.net/problem/15596

 

15596번: 정수 N개의 합

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Python 2, PyPy2, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

 

문제

정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.

작성해야 하는 함수는 다음과 같다.

  • C, C11, C (Clang), C11 (Clang): long long sum(int *a, int n);
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • n: 합을 구해야 하는 정수의 개수
    • 리턴값: a에 포함되어 있는 정수 n개의 합
  • C++, C++11, C++14, C++17, C++ (Clang), C++11 (Clang), C++14 (Clang), C++17 (Clang): long long sum(std::vector<int> &a);
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합
  • Python 2, Python 3, PyPy, PyPy3: def solve(a: list) -> int
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 리스트 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합 (정수)
  • Java: long sum(int[] a); (클래스 이름: Test)
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합
  • Go: sum(a []int) int
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 배열 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합

 

출처

 

알고리즘 분류

 

제출할 수 있는 언어

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Python 2, PyPy2, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

 

채점 및 기타 정보

  • 예제는 채점하지 않는다.

 


문제 풀이

먼저 알고리즘을 제출해봅니다

어떻게 제출해야하는지 힌트가 나옵니다

저도 지금까지 어떻게 정답을 제출해야할지 고민을 하다가 이것을 보고 아! 이렇게 제출하면 되는구나 깨달았습니다 ㅠ

 


1. 제가 맨 처음 정답을 맞춘 방식입니다

제일 무난한 방법이라고 생각합니다

for문을 사용해서 합계를 구해 합계를 return해줍니다

public class Test {
	// 합을 구하는 메소드 선언
	long sum(int[] a)
	{
		// 합계를 입력할 변수 선언
		long sum = 0;
		
		// 반복문을 사용해 a배열의 데이터를 sum에 계산
		for(int i = 0; i < a.length; i++)
		{
			sum += a[i];
		}
		
		// 결과return
		return sum;
	}
}

 

2. 두 번째로 풀은 방식은 향상된 for문을 사용하여 합계를 구해 return해줍니다

public class Test {
	// 합을 구하는 메소드 선언
	long sum(int[] a)
	{
		// 합계를 입력할 변수 선언
		long sum = 0;
		
		// 향상된 반복문을 사용 합계를 구함
		for(int i : a)
		{
			sum += i;
		}
		
		// 결과return
		return sum;
	}
}

 

3. 세 번째로 풀은 방식은 while문을 사용하여 풀었습니다

 방식 자체는 위와 같습니다

public class Test {
	// 합을 구하는 메소드 선언
	long sum(int[] a)
	{
		// 합계를 입력할 변수 선언
		long sum = 0;
		int count = 0;
		
		// while문을 사용 합계를 구함
		while(count < a.length)
		{
			sum += a[count];
			count++;
		}
		
		// 결과return
		return sum;
	}
}

 

여기까지 제가 풀은 세 가지 방법이었습니다

이제 3가지 구문의 속도를 비교해보겠습니다!!

어느 방법이 제일 빠를까요??

 


속도 비교

중간에 틀렸습니다는 그냥 넘어가주세요 ㅠ_ㅠ

1. 일반 for문

2. 향상된 for문

3. while문

으로 풀었을 때의 메모리와 시간입니다

속도는 향산된 for문과 while문으로 풀었을 때의 속도가 같네요

그런데??? 일반for문이 왜 속도차이가 이렇게 나는지는 잘 모르겠네요;;

똑같을거 같은데;;

메모리는 향상된 for문이 제일 빠르게 나왔습니다

이상 백준 알고리즘 15596번 문제 정수 N개의 합을 풀은 내용이었습니다

이 글이 알고리즘을 공부하는 분들께 도움이 되었으면 좋겠습니다!!!

 

다음 문제 : 2021.05.09 - [알고리즘/알고리즘JAVA] - [백준알고리즘/함수] 4673번 문제 : 셀프 넘버(자바/JAVA)

반응형
그리드형