본문 바로가기
Algorithm/백준 단계별 문제

[백준] 6. Funtion 함수 - Java 코드

https://www.acmicpc.net/step/5

 

함수 단계

함수를 구현해 봅시다. (이 문제는 C, C++, Python, Java, Go만 지원합니다. 그 외의 언어를 사용하신다면 이 문제를 무시해 주세요.)

www.acmicpc.net

함수부터는 난이도가 조금 다른것같아서

개별적으로 문제리뷰를 올리겠습니다.

 

# 15596

정답 코드

public class Test {
    long sum(int[] a) {
        long ans = 0;
        for(int i=0;i<a.length;i++){
            ans+=a[i];
        }
        return ans;
    }
}

 첫번쨰 문제는 쉽습니다.

 

 

 

 

# 4673

 

- 제출한 정답 코드

public static void main(String[] args) {
		int[] arr = new int[10036];	// 10000의 각 자리수합에 최대값이 10036이므로
		int tmp,res;
		for(int i=1; i<=10000; i++) {
			tmp=i;
			res=i;
			while(tmp>0) {
				res += tmp%10;
				tmp/=10;
			}
			arr[res]++;
		} // 셀프넘버 찾기
        
		for(int i=1; i<10000; i++) {
			if(arr[i]==0)
				System.out.println(i);
		} // 셀프넘버 출력
    }
	    

저는 이런식으로 풀었습니다. 10000이라는 숫자까지 돌며 부르트 포스 방식으로 일일이 셀프넘버를 찾았고,

또다시 10000을 넘지않는 셀프넘버만을 출력해주었습니다. 

여기서 중요한건 셀프넘버를 저장할 배열에 최대값은 9999가 가지는 10036입니다,

이 방식은 생성자를 찾는 방식보다, 훨씬 간소하고 효율적이라고 생각했습니다.

 

비교해보실만한 다른코드를 공유해드립니다.

public class Main {

	public static void main(String[] args) {
		boolean[] isNotSelfNumber = new boolean[10001];
		
		for (int i = 1; i <= 10000; ++i) {
			int dn = getDn(i);
			if (dn <= 10000) {	
				isNotSelfNumber[dn] = true;				
			}
		}
		
		for (int i = 1; i < isNotSelfNumber.length; ++i) {
			if (!isNotSelfNumber[i]) { 
				System.out.println(i);				
			}
		}
	}
	
	private static int getDn(int n) {	
		int dn = n;
		while(n > 0) {
			dn += n % 10;
			n /= 10;
		}
		return dn;
	}

}

구글기준 첫번째 블로글에 코드인데요. while문과 if문이 많아서 더 시간과 메모리측면에서 비효율적입니다.

 

# 1065

저는 사실 문제 이해부터 조금 난해했습니다.

여기서 중요한건

1~99까지 모두 등차수열로 취급 해주고 있는것이였습니다. (당황스러운 문제..)

즉, 99이하의 수가 들어오면 등차수열의 개수는 

입력받은수 그자체였습니다.

 

풀이코드를 보실까요?

  // 한수
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
		int n,han=0;
		int[] a=new int[3];
		n = sc.nextInt();
		if(n<100)
			han=n;
		else if(n==1000) {
			han=144;
		}
		else {
			han=99;
			for (int i = 100; i <= n; i++) {
				int k = 0; 
				int t = i;
				while (t > 0) {
					a[k] = t % 10;
					t /= 10; 
					k++;
				}
				if (a[0] - a[1] == a[1] - a[2]) 
					han++;
				}		
			}
		System.out.println(han);		
		sc.close();

    }

else if에서 1000이 들어왔을땐, 999을 넣었을때와 같은 값으로 돌려보고 처리해주어 예외사항을 간단히 해결하고

세자리수에 대해서만 구현해주었습니다.

자릿수를 받는 a 배열에 while문을 통해 넣어주고

if (a[0] - a[1] == a[1] - a[2]) 문을 통해 등차수열인지 확인해줍니다. 맞으면 ++

최종값을 출력해주면 끝!

+

마지막문제는 사실 어려웠어요.  등차수열 계산이 한자리수일때, 두자리수일때는 모두 등차수열로 취급해주므로,

세자리수일때와 1000이 들어올때만 나눠서 잘 처리하면되는 문제였습니다.

언제나 문제이해가 제일 중요하네요!