백준 15596번
자바
정수 N개의 합
간단하게 함수를 구현하는데 문서에 적힌 요구사항과 같이 클래스 이름은 Test인 곳에 sum이라는 메소드를 작성하면 된다.
foreach문을 사용해서 배열에 접근 후 계산하는 방식으로 코드를 설계하면 아래와 같다.
public class Test {
long sum(int[] a) {
long ans = 0;
for(int i : a){
ans += i;
}
return ans;
}
}
백준 4673번
자바
셀프넘버
이번 문제에서는 조건을 정리하고 함수로 만들면 간단하게 풀 수 있다.
셀프 넘버의 조건을 알아보면
1. 그 수 + 각 자리의 단일 숫자 = "셀프넘버"
2. 1~10000까지 셀프넘버
package method;
public class Q4673 {
public static void main(String args[]) {
boolean[] noSelfNnumberSet = new boolean[10001];
for(int i=1; i<=10000; i++){
int selfIndex = CheckSelfNumber(i);
noSelfNnumberSet[selfIndex] = true;
}
for (int j=0; j<=10000; j++){
if(!noSelfNnumberSet[j]) System.out.println(j);
}
}
public static int CheckSelfNumber(int num){
int ans = num;
if(num>=1000) {
ans += num/1000;
num %= 1000;
}
if(num>=100) {
ans += num/100;
num %= 100;
}
if(num>=10) {
ans += num/10;
num %= 10;
}
if(num>=0) {
ans += num;
}
if(ans<=10000) return ans;
else return 0;
}
}
코드가 좀 흉측스럽다.
바로바로 요구사항을 코드에 담아내려다 보니까 정리가 되지 않는 듯한 모습이다.
일단 살펴보면 main함수에서는 1~10000까지의 숫자를 반복하면서 함수를 호출한다.
호출된 함수는 들어온 숫자에 대해서 생성자를 출력한다.
이제 다시 메인함수로 돌아와서 selfnumber를 체크하는 배열에 다음의 인덱스는 selfnumber의 조건이 성립되지 않는다고 한다.
이 때 배열의 초기값은 false이므로 역전시켜서 true값을 저장한다.
이제 배열에는 생성자를 가지고 있는 녀석들은 True, 없는 애들은 False값을 가지게된다.
따라서 False값을 가진 녀석들을 출력하면 Selfnumber인 숫자들이 출력되게 된다.
여기서 포인트는 CheckSelfNumber에서 하향식 구조의 조건문을 적용시킨다는 것이다.
어차피 숫자 자리 하나하나 계산하여 더해야하기 때문에 숫자 자리를 가질 수 있도록 나누고, 나머지를 생산한 뒤
마지막에 모두 합쳐서 반환하면 그 수는 파라미터의 생성자가 된다.
>> boolean의 초기값 False
>> 각 자릿수에 대한 연산은 조건문을 하향식 구조로 연결 !
+ 블로그를 보면서 다른 코드를 보던 중 숫자의 자리를 추출하는데 깔끔한 코드를 참조하면 아래와 같다.
public static int makeSum(int number) {
int sum = number;
while(number!=0) {
sum = sum + (number%10); // 첫 자리
number = number/10; // 10을 나누어 첫 자리를 없앤뒤 반복
}
return sum;
}
백준 1065번
자바
한수
import java.util.Scanner;
public class Main {
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
System.out.println(CountHansoo(num));
}
public static int CountHansoo(int n){
int cnt = 0;
if(n<100) return n;
else{
cnt = 99;
if(n==1000) n=999;
for(int i=100; i <= n; i++){
int x = i/100;
int y = (i/10)%10;
int z = i%10;
if(x-y == y-z) cnt++;
}
}
return cnt;
}
}
문제는 쉬웠으나 예외처리 부분에서 조금 헤맸다.
처음에 세자리까지만 커버하면 된다고 생각하고 코드를 짯는데
인풋으로 1000이 들어온 경우에는 따로 처리를 해줘야한다.
하지만 이때는 1000은 한수가 아니므로 1000을 999로 간단히 고치면 문제가 해결된다.
'Code > baekjoon [ 단계별 ]' 카테고리의 다른 글
백준 단계별 <문자열> (0) | 2022.02.25 |
---|---|
백준 단계별 (0) | 2022.02.21 |
백준 단계별 문제 <배열> (0) | 2022.02.19 |
백준 단계별 문제 <1차원 배열> (0) | 2022.02.16 |
백준 단계별 문제 <for문> (0) | 2022.02.14 |