[Baekjoon] 함수 : 4673 문제

2019. 7. 19. 20:25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import java.util.Scanner;
 
 
//셀프넘버는 생성자가 없다
//생성자란 자기자신+각자리 숫자=다른 숫자가 될 수 있는 경우에서의 자기 자신
//예를들어 33은 39의 생성자, 그러니까 39는 셀프넘버가 아니라는 뜻
 
//목적: 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램 작성
 
 
public class P_4673  {
    public static void main(String args[]) {
        
        int result[] = new int[10000]; //self_none_num
        int not_self[] = new int[10000];
        int loop = 0//배열 출력을 위해 세는 index
        int select = 1;
        int index = 0;
        int no_array_index = 0;
        
        for(int numbers=0; numbers<10000; numbers++) {
            self_number(String.valueOf(numbers), result, numbers);
        } //만번 함수 반복
        
        Arrays.sort(result); //오름차순으로 정렬
        
        while(select == 1) {
             if((index == 9999|| (loop == 10000)) { //범위를 초과했는지 안 초과했는지 확인
                    select = 0;
                    break;
             } else if(result[index] == result[index+1]) { //다음 숫자 중복 체크
                        ++index;
                        
                } else if(result[index] == loop) { //self 배열에 존재하는 수일 경우
                    ++index; //그냥 지나가기
                    ++loop;
                
                } else if(result[index] > loop) { //배열에 없는 수일 경우
                    not_self[no_array_index] = loop;
                    ++no_array_index;
                    ++loop;
                }
            }
        
        //확인용 출력
        for(int i=0;  i<no_array_index; i++) {
            System.out.println(not_self[i]);
        }
        
    }
 
public static void self_number(String self, int result[], int index) { //숫자 넣기(현재 숫자), 결과를 담을 배열, index(현재 숫자)
    
    int divide[] = new int[5]; //한자리수씩 담을 숫자
    int is_self = Integer.valueOf(self); //연산 결과 나온 숫자, 자기 자신먼저 더해놓기
    
    for(int i=0; i<self.length(); i++) { //네 자리를 다 받아야 하기 떄문에 (만까지 자릿수가 5개)
        divide[i] = self.charAt(i) - '0'//'0'의 아스키코드 값을 주면 바로 char->int형 전환 가능
        is_self += divide[i];
    }
    
    result[index] = is_self; //해당하는 인덱스의 배열 안에 selft_none인 숫자를 담음
 
    
    //함수의 목적: 생성자가 없는 수를 걸러내고 출력하는 역할
    //for문으로 해결
 
    
    }
}
 
 

생각하는데 조금 시간이 걸렸지만 혼자 힘으로 맞췄다는 것에 매우 뿌듯했다. 

 

오늘 배운 문법

 

1. for(int num: array) {

저번에도 사용했지만 정확한 뜻을 알기에는 조금 부족했다. 이제 확실히 알았다.  

예시로, 

 

int array[]= {10, 40, 30, 50} 

for(int num:array) {

      System.out.printIn(num)

}

 

결과는 10, 40, 30, 50이 차례대로 출력된다. 따라서 num이 array의 인덱스에 순차적으로 접근해 결과를 출력하는 것을 볼 수 있다.

 

2. Array.sort();

선택정렬을 쓸까, 고민하다가 단순히 정렬만 하는 되는 문제라 sort 메소드를 써서 자동으로 오름차순으로 정렬을 했다. 

앞으로 정렬 문제가 아니라면 요긴하게 쓰일 것 같다.

 

알고리즘을 순차적으로 하나씩 생각하느라 코드가 계속 복잡해지고 있지만.. 그래도 초보자들에게는 직관적인 코드라 나같은 상황에 있는 사람들에게 참고용으로 도움되었으면 좋겠다. 아직은 초보 단계라, 문제를 순차적으로 해결하는 연습에만 초점을 두고 있다. 나도 언젠가 짧고 효율적인 코드를 짤 수 있는 사람이 되었으면 좋겠다.

BELATED ARTICLES

more