• Homework(4)

    2021. 6. 22.

    by. 와트

    문제. 문자열과 문자열에서 검색될 문자를 입력 받아 문자열에 그 문자가 몇 개인지 개수를 확인하는 프로그램을 작성하세요. (검색할 문자가 영문자가 아니면 "영문자가 아닙니다." 출력 후 프로그램 종료)

    문자열 입력 : application
    검색할 문자 입력 : p
    'p'가 포함된 갯수 : 2 개 문자열 입력 : apple_test123
    문자 입력 : ㄱ
    영문자가 아닙니다.
    더보기

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
        public void test() {
            Scanner sc = new Scanner(System.in);
            System.out.println("문자열을 입력하세요 > ");
            String str = sc.nextLine();
            System.out.println("검색할 문자를 입력하세요 > ");
            char ch = sc.next().charAt(0);
            int num = 0;
            
            if(!((int)ch >= 65 && (int)ch <= 90&& !((int)ch >=97 && (int)ch <= 122)) {
                System.out.println("영문자가 아닙니다.");
                return;
            }
            
            for(int i = 0; i < str.length(); i++) {
                if(str.charAt(i) == ch) {
                    num++;
                }
            }
            System.out.printf("'%c'가 포함된 갯수 : %d개",ch, num);
            }
    cs

    아스키 코드를 사용한다고 int로 강제형변환을 해줬는데 

    그냥 (ch >='A' && ch <= 'Z') &&(ch >='a' && ch <= 'z')로 해도 된다.

    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
        public void testAnswer() {
            Scanner sc = new Scanner(System.in);
            System.out.println("문자열을 입력하세요 > ");
            String str = sc.nextLine(); //공백을 포함하겠다는 의도
            
            System.out.println("검색할 문자를 입력하세요 > ");
            char ch = sc.next().charAt(0);
            
            //검색할 문자 유효성 검사
            //영문자 : A-Z a-z
            boolean isUpperCase = ch >= 'A' && ch <= 'Z'//65~90
            boolean isLowerCase = ch >= 'a' && ch <= 'z'//97~122
            
            if(!isUpperCase && !isLowerCase) {
                System.out.println("영문자가 아닙니다.");
                return;
            }
            
            int cnt = 0;
            
            //문자열의 문자를 하나씩 순회
            for(int i = 0; i < str.length(); i++) {            
                char currentChar = str.charAt(i);
                if(currentChar == ch) {
                    cnt++;
                }
            }
            System.out.println(cnt);
        }
    cs

     

    문제. 3명의 회원정보를 입력 받아 저장하고 출력하는 프로그램을 만드세요

    (입력 : 이름, 나이, 주소, 키, 몸무게, 연락처 )

    ================ 저장회원===============
    1 홍길동 19세 서울시 강남구 170cm 68kg 01012345678
    2 임걱정 20세 경기도 수원시 180cm 75kg 01012345678 

    기능추가1
    //출력결과 마지막행에 다음 항목에 대한 평균을 구하시오.
    ============================================
    평균나이 00세 / 평균 키 : 00CM / 평균 몸무게 : 00kg

    기능추가2
    //입력할 회원 수를 입력하고 그 수 만큼 회원을 입력 받게 업그레이드 하세요

    받고 출력해야 할 정보가 많아서 복잡한 문제였다.
    사실 좀 더 간단하게 해결할 수 있는 방법이 있었는데 '이건 배열 아니면 못 푼다'라는 생각으로 풀었다.

    나중에 다른 분이 공유해주신 답안 보고 저런 방법도 있구나 감탄했다.

    배우는 입장으로서 나간 진도로만 문제를 풀어보는 연습도 필요한데 그러기가 참 어렵다.

    더보기
    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
        public void test() {
            Scanner sc = new Scanner(System.in);
            System.out.println("회원 수를 입력하시오 > ");
            int num = sc.nextInt();
            
            String[] name = new String[num];
            int[] age = new int[num];
            String[] address = new String[num];
            int[] height = new int[num];
            int[] weight = new int[num];
            String[] contact = new String[num];
            
            int ageAve = 0;
            int heightAve = 0;
            int weightAve = 0;
            
            for(int i = 0; i < num; i++) {
                System.out.println("이름을 입력하시오 > ");
                name[i] = sc.next();
                System.out.println("나이를 입력하시오 > ");
                age[i] = sc.nextInt();
                sc.nextLine();
                System.out.println("주소를 입력하시오 > ");
                address[i] = sc.nextLine();
                System.out.println("키를 입력하시오 > ");
                height[i] = sc.nextInt();
                System.out.println("몸무게를 입력하시오 > ");
                weight[i] = sc.nextInt();
                System.out.println("연락처를 입력하시오 > ");
                contact[i] = sc.next();
            }
            
            System.out.println("============= 저장회원 ===============");
            for(int j = 0; j <num; j++) {
                ageAve += age[j];
                heightAve += height[j];
                weightAve += weight[j];
                System.out.printf("%d %s %d세 %s %dcm %dkg %s%n",j+1, name[j], age[j], address[j], height[j], weight[j], contact[j]);
            }
            System.out.printf("===================================%n"
                    + "평균나이 : %d세 / 평균 키 : %dcm / 평균 몸무게 : %dkg%n",ageAve/num, heightAve/num, weightAve/num);
        }
    cs

    사실 배열로 문제를 풀면 나중에 해당 정보를 다시 불러올 때는 훨씬 깔끔하고 간단하기는 하다.

    다만 아직 배우지 않은 방법으로 이 방법 밖에는 없다고 스스로 한계를 짓지 않는 게 좋겠다는 생각.

     

    더보기

     

    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
        private void test() {
            Scanner sc = new Scanner(System.in);
            String name = "";
            int age = 0;
            String addr = "";
            int height = 0;
            int weight = 0;
            String phone = "";
            
            //회원수
            System.out.print("몇명의 회원을 등록할까요? => ");
            int memberCnt = sc.nextInt();
            
            String result = "=================== 저장회원 ==================\n";
            
            
            //기능추가
            int sumAge = 0;
            int sumHeight = 0;
            int sumWeight = 0;        
            
            double avgAge = 0;
            double avgHeight = 0;
            double avgWeight = 0;
            
            for (int i = 0; i < memberCnt; i++) {
                System.out.println("-------------- "+(i+1)+" -----------------");
     
                System.out.print("이름을 입력하세요 : ");
                name = sc.next();
                
                System.out.print("나이를 입력하세요 : ");
                age = sc.nextInt();
                
                sc.nextLine();
                System.out.print("주소를 입력하세요 : ");
                addr  = sc.nextLine();
                
                System.out.print("키를 입력하세요 : ");
                height = sc.nextInt();
                
                System.out.print("몸무게를 입력하세요 : ");
                weight = sc.nextInt();
                
                
                System.out.print("연락처를 입력하세요 : ");
                phone = sc.next();
                
                result += (i+1)+"\t"+name+"\t"+age+"\t"+addr+"\t"+height+"cm\t"+weight+"kg\t"+phone+"\n";
                
                //기능추가
                sumAge += age;
                sumHeight += height;
                sumWeight += weight;
            }
            
            avgAge = (int)((sumAge*1.0/memberCnt)*10)/10.0
            avgHeight = (int)((sumHeight*1.0/memberCnt)*10)/10.0;
            avgWeight = (int)((sumWeight*1.0/memberCnt)*10)/10.0;
            
            //refactoring
    //        avgAge = (int)(sumAge*10.0/memberCnt)/10.0;
    //        avgHeight = (int)(sumHeight*10.0/memberCnt)/10.0;
    //        avgWeight = (int)(sumWeight*10.0/memberCnt)/10.0;
            
            
            result += "===========================================\n";
            result += "평균나이 : "+avgAge+"세 | 평균신장 : "+avgHeight+"cm | 평균몸무게 : "+avgWeight+"kg";
            
            System.out.println(result);
            
        }
    cs

    아직 복합대입연산자를 유연하게 사용하는 능력이 부족해 보인다.

    더 쓰고 더 고민하고 더 사용해봐야겠다.

     

    avgAge = (int)((sumAge*1.0/memberCnt)*10)/10.0

    -> 여기서 sumAge에 1.0을 곱하는 이유는 double로 형변환하기 위해서. 이후 평균값을 구한 후 10을 곱해 소수점 한자리까지 만들 정보를 확보하고 int로 강제형변환을 해서 아래 소수점 자리들을 없앤다. 이후 10.0을 다시 곱하면 소수점 한자리까지만 나오는 double형의 나이 평균을 구할 수 있다.

    printf를 통해 %.1f를 써도 되지만 이런 경우 출력할 때만 해당 값을 꺼내오는 것이고, 위 방법을 사용하면 변수에 이 값이 저장되어 어느 때건 불러오기가 편하다.

    '혼자 있는 방 > Java' 카테고리의 다른 글

    Homework(6)  (0) 2021.06.24
    Homework(5)  (0) 2021.06.23
    Homework(3)  (0) 2021.06.21
    Homework(2)  (0) 2021.06.18
    Homework(1)  (0) 2021.06.17

    댓글

Designed by Nana