TIL Java

내일배움캠프 15일차 TIL _ 4주 1일차

mad038 2024. 5. 7. 13:07

 

  • 오늘 있었던 일
    • 알고리즘 복습및 팀 과제

팀과제

     ●  리팩토링

더보기

● 해당 문을

 public static void studentNew() {
        Scanner scanner = new Scanner(System.in);
        Set<Integer> studentSubjects_list_test = new HashSet<>();
        StateType stateType = null;
        System.out.println();


        while (true){
            int studentId = DataRegistry.getStudentId();
            // 이름 생성
            System.out.print("학생이름을 입력해주세요 name: ");
            String studentName = scanner.next();
            System.out.println();

            // 과목 등록
            List<Subject> studentSubjects_list = new ArrayList<>();
            int count = 0;
            int count_sub = 0;
            System.out.println("등록할 과목을 입력해 주세요 \n 최소 3개 이상의 필수 과목, 2개 이상의 선택 과목");
            int stats_s;
            while (true) {

                if (count < 90) {
                    System.out.print("필수 과목 : 1.Java , 2.객체지향 , 3.Spring , 4.JPA , 5.MySQL  \n 입력해주세요 : ");

                } else if (count_sub < 900  && count >= 100 ) {
                    System.out.print("선택 과목 : 1.디자인 패턴 , 2.Spring Security , 3.Redis , 4.MongoDB \n 입력해주세요 :  ");
                }

                String subjectName = scanner.next();
                String test_int = "^[0-9]*$";
                int subjectId = 0;
                if (subjectName.matches(test_int)) {
                    subjectId = Parser.parseId(subjectName);
                }

                if (count <= 99 && subjectId <= 5) {
                    if (studentSubjects_list_test.contains(subjectId)) {
                        System.out.println(" 이미 등록하신 과목입니다.");
                    } else {
                        studentSubjects_list_test.add(subjectId);
                        count++;
                        switch (subjectId) {
                            case 1 -> studentSubjects_list.add(DataRegistry.getSubjects().get(0));
                            case 2 -> studentSubjects_list.add(DataRegistry.getSubjects().get(1));
                            case 3 -> studentSubjects_list.add(DataRegistry.getSubjects().get(2));
                            case 4 -> studentSubjects_list.add(DataRegistry.getSubjects().get(3));
                            case 5 -> studentSubjects_list.add(DataRegistry.getSubjects().get(4));
                            default -> subjectId = 0;
                        }

                        System.out.println(count + "번째 과목 선택됨 = " + DataRegistry.getSubjects().get(subjectId -1).getSubjectName());
                        System.out.println();

                        if (count >= 3 && count <= 100) {
                            System.out.println("3개 이상입니다. \n 선택과목을 선택하려면 '99' 을 입력해 주세요");
                        }
                    }

                }
                else if (count_sub < 900  && count >= 100 || subjectId == 99) {
                    System.out.println();
                    count += 100;

                    if (subjectId < 5) {

                        if (studentSubjects_list_test.contains(subjectId + 10)) {
                            System.out.println(" 이미 등록하신 과목입니다.");
                        } else {
                            count_sub++;
                            studentSubjects_list_test.add(subjectId + 10);
                            switch (subjectId) {
                                case 1 -> studentSubjects_list.add(DataRegistry.getSubjects().get(5));
                                case 2 -> studentSubjects_list.add(DataRegistry.getSubjects().get(6));
                                case 3 -> studentSubjects_list.add(DataRegistry.getSubjects().get(7));
                                case 4 -> studentSubjects_list.add(DataRegistry.getSubjects().get(8));
                                default -> subjectId = 0;
                            }


                            if(subjectName.matches(test_int)){
                                System.out.println(count_sub + " 번째 선택 과목 선택됨 " + DataRegistry.getSubjects().get(subjectId + 4).getSubjectName());
                                System.out.println();
                            }

                        }
                        // 여기에 추가
                        if (count_sub >= 2 && subjectName.matches(test_int)) {
                            System.out.print("2개 이상입니다. 상태를 등록 하려면 '888' 을 입력해 주세요 : ");
                            System.out.println();
                        }
                    }else if (count_sub < 900  && count >= 1000 || subjectId == 888) {
                        count_sub += 999;
                        System.out.print("상태입력 1, RED 2, YELLOW 3,GREEN : ");

                        stats_s = scanner.nextInt();
                        switch (stats_s) {
                            case 1 -> stateType = StateType.RED;
                            case 2 -> stateType = StateType.YELLOW;
                            case 3 -> stateType = StateType.GREEN;
                            default -> System.out.println("제대로 입력해주세요");
                        }
                        break;
                    }
                } else {
                    System.out.println("제대로 된 과목을 입력해 주세요");
                }
            }
            DataRegistry.addStudent( new Student(studentId ,studentName, studentSubjects_list,stateType));
            studentSubjects_list_test.clear();

            System.out.println();
            System.out.print(" 추가를 끝내시겠습니까?  끝내기 = (n) 추가 = (y) \n 입력해 주세요 : ");
            String next = scanner.next();
            if (next.equals("n")) {
                break;
            }
        }
    }
  • 이 문으로 리팩토링
 // 수강생 생성
    public static void studentNew() {
        while (true){
            Scanner scanner = new Scanner(System.in);

            // ID값 등록
            int studentId = DataRegistry.getStudentId();

            // 이름 등록
            System.out.print("\n학생이름을 입력해주세요 name: ");
            String studentName = scanner.next();

            // 과목 등록
            Set<Integer> studentSubjects_list_test = new HashSet<>();
            List<Subject> studentSubjects_list = new ArrayList<>();
            boolean SubjectsMain = false;
            boolean SubjectsSub  = false;
            String test_int = "^[0-9]*$";

            System.out.println("\n 등록할 과목을 입력해 주세요 \n 최소 3개 이상의 필수 과목, 2개 이상의 선택 과목");
            while (true) {
                if (!SubjectsMain) System.out.print("필수 과목 : 1.Java , 2.객체지향 , 3.Spring , 4.JPA , 5.MySQL  \n 입력해주세요 : ");
                else if (!SubjectsSub) System.out.print("선택 과목 : 1.디자인 패턴 , 2.Spring Security , 3.Redis , 4.MongoDB \n 입력해주세요 :  ");
                else System.out.print( "\n 상태입력 1, RED 2, YELLOW 3,GREEN : ");

                String subjectName = scanner.next();
                // 문자열을 감지해 => 정수값

                int subjectId = 0;
                if (subjectName.matches(test_int)) {
                    subjectId = Parser.parseId(subjectName);
                }

                if (!SubjectsMain) {
                    // 메인
                    SubjectsMain = studentNewSubjectsMain( studentSubjects_list_test, subjectId, studentSubjects_list );
                }else if (!SubjectsSub) {
                    //서브
                    SubjectsSub = studentNewSubjectsSub( studentSubjects_list_test, subjectId, studentSubjects_list );
                }else if(subjectId <= 3) {
                    // 상태
                    StateType stateType = studentNewStateType(subjectId);
                    // 생성 완료
                    DataRegistry.addStudent( new Student(studentId ,studentName, studentSubjects_list,stateType));
                    break;
                }else {
                    System.out.println("지정 범위내의 값을 입력해 주세요");
                }
            }

            System.out.print("\n 추가를 끝내시겠습니까?  끝내기 = (n) 추가 = (y) \n 입력해 주세요 : ");
            String next = scanner.next();
            if (next.equals("n")) {
                break;
            }
        }
    }

    // 매인 수업
    private static boolean studentNewSubjectsMain(Set<Integer> studentSubjects_list_test, int subjectId, List<Subject> studentSubjects_list) {
        boolean SubjectsMain = false;
        if (studentSubjects_list_test.contains( subjectId )) {
            System.out.println(" 이미 등록하신 과목입니다.");
        } else if (subjectId == 99) {
            SubjectsMain = true;
            studentSubjects_list_test.clear();
        }else {
            studentSubjects_list_test.add( subjectId );
            switch (subjectId) {
                case 1 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 0));
                case 2 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 1));
                case 3 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 2));
                case 4 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 3));
                case 5 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 4));
                default -> System.out.println("지정 범위내의 값을 입력해 주세요");
            }
            System.out.println( studentSubjects_list_test.size() + "번째 과목 선택됨 = " + DataRegistry.getSubjects().get( subjectId -1).getSubjectName());
            System.out.println();
            if (studentSubjects_list_test.size() >= 3) {
                System.out.println("3개 이상입니다. \n 선택과목을 선택하려면 '99' 을 입력해 주세요");
                System.out.println();
            }
        }
        return SubjectsMain;
    }
    // 서브 수업
    private static boolean studentNewSubjectsSub(Set<Integer> studentSubjects_list_test, int subjectId, List<Subject> studentSubjects_list) {

        boolean SubjectsSub = false;
        if (studentSubjects_list_test.contains( subjectId + 10 )) {
            System.out.println( " 이미 등록하신 과목입니다." );
        } else if (subjectId == 99 ) {
            SubjectsSub = true;
            studentSubjects_list_test.clear();
        } else {
            studentSubjects_list_test.add( subjectId + 10 );
            switch (subjectId) {
                case 1 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 5 ) );
                case 2 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 6 ) );
                case 3 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 7 ) );
                case 4 -> studentSubjects_list.add( DataRegistry.getSubjects().get( 8 ) );
                default -> System.out.println("지정 범위내의 값을 입력해 주세요");
            }
            System.out.println( studentSubjects_list_test.size() + " 번째 선택 과목 선택됨 " + DataRegistry.getSubjects().get( subjectId + 4 ).getSubjectName()+"\n");
        }
        if (studentSubjects_list_test.size() >= 2) {
            System.out.print( "2개 이상입니다. 상태를 등록 하려면 '99' 을 입력해 주세요 : " );
            System.out.println();
        }
        return SubjectsSub;
    }

    private static StateType studentNewStateType( int stats_set) {
        StateType stateType = null;
        switch (stats_set) {
            case 1 -> stateType = StateType.RED;
            case 2 -> stateType = StateType.YELLOW;
            case 3 -> stateType = StateType.GREEN;
            default -> System.out.println("지정 범위내의 값을 입력해 주세요");
        }
        return stateType;
    }
}

 

알고리즘 문제풀기

     ●  문자열 내 마음대로 정렬하기

더보기

● 문자열 내 마음대로 정렬하기 //링크

import java.util.Arrays;
class Solution {
    public String[] solution(String[] strings, int n) {
         String[][] nst = new String[strings.length][2];
        String[] answer = new String[strings.length];

        Arrays.sort(strings);
        for (int i = 0; i < strings.length; i++) {
            nst[i][0] = strings[i];
            nst[i][1] = strings[i].split("")[n];
        }

        Arrays.sort(nst,(o1,o2)-> o1[1].compareTo(o2[1]));
        
        for (int i = 0; i < nst.length; i++) {
            answer[i] = nst[i][0];
        }
        return answer;
    }
}
  • 첫 시도시 예시문제와 첫 문제만 통과하고 다른 문제는 통과하지 못했다
    • = 방식은 틀리지 않음 그렇다면 왜? 
    • 문제 지문에
      • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.
    • 그렇다면 어떻게 해야하나 정렬의 조건을 추가? 해야하나 ?
      • 정렬의 조건을 추가하자 문자열이라 어렵다 
      • 시작시 한번 정렬하고 하자
      • Arrays.sort(strings);​
  • 성공함 밑은 다른 사람의 풀이
  • import java.util.*;
    
    class Solution {
        public String[] solution(String[] strings, int n) {
            String[] answer = {};
            ArrayList<String> arr = new ArrayList<>();
            for (int i = 0; i < strings.length; i++) {
                arr.add("" + strings[i].charAt(n) + strings[i]);
            }
            Collections.sort(arr);
            answer = new String[arr.size()];
            for (int i = 0; i < arr.size(); i++) {
                answer[i] = arr.get(i).substring(1, arr.get(i).length());
            }
            return answer;
        }
    }​
  • 2중 배열을 사용한 나와 다르게 리스트문을사용해 제작했다.

 

     ●  이상한 문자 만들기

더보기

● 이상한 문자 만들기 //링크

class Solution {
    public String solution(String s) {
        String[] words = s.split("");
        String answer = "";
        int counter = 0;
        for (String word : words) {
            if (word.equals(" ")) {
                counter = 0;
            } else{
                counter++;
            }
            
            if (counter % 2 == 0) {
                answer += word.toLowerCase();
            }else{
                answer += word.toUpperCase();
            }
        }
        
        return answer;
    }
}
  • 첫 시도시 2중 for문으로 제작했지만 예시만 통과하고 이후 90%에서 멈췄다.
    • = 방식은 틀리지 않음 그렇다면 왜? 
    • 문제 지문에
      •  각 단어는 하나 이상의 공백문자로  .
    • 그렇다면 어떻게 해야하나 정렬의 조건을 추가? 해야하나 ?
      • 각 단어를 다른 문자열로 만들어 넣자 90%
      • 토큰을 써보자 = 70%
      • 단순하게 글자 마다 카운터를 일일히 세게 만들자
  • 성공함 밑은 다른 사람의 풀이
  • class Solution {
      public String solution(String s) {
    
            String answer = "";
            int cnt = 0;
            String[] array = s.split("");
    
            for(String ss : array) {
                cnt = ss.contains(" ") ? 0 : cnt + 1;
                answer += cnt%2 == 0 ? ss.toLowerCase() : ss.toUpperCase(); 
            }
          return answer;
      }
    }
  • 거의 동일문이지만 삼항연산자로 코드를 확연히 줄였다.

 

     ●  삼총사

더보기

● 삼총사  //링크

class Solution {
    public int solution(int[] nums) {
        int count = 0;

        for (int i = 0; i < nums.length-2; i++) {
            for (int j = i+1; j < nums.length - 1; j++) {
                for (int k = j+1; k < nums.length; k++) {
                    if (nums[i] + nums[j] + nums[k] == 0) {
                        count++;
                    }
                }
            }
        }
        return count;
    }
}
  • 첫 시도시 동일 배열을 조건문으로 줄이고 배열을 늘렸지만 통과하지 못했다.
    • = 방식 자체가 틀림
    • 배열을 늘리는 식으로는 불가능하다.
      • 그렇다면 배열을 줄여야하나? 아니면 조건을?
    • 조건? 배열? 
      • set 컬랙션을 이용해 동일값이 겹치는 것을 막았다. = 30%
      • 조건을 추가해 0이 되는 값을 고쳤다 = 0%
        • 문제마다 값을 맞춰야하기에 아에 틀린문
      • 배열 자체를 줄인다 = 성공
  • 성공함 밑은 다른 사람의 풀이
  • class Solution {
        public int solution(int[] number) {
            int answer = 0;
    
            for(int i=0; i<number.length-2; i++){
                for(int j=i+1; j<number.length-1; j++){
                    for(int k=j+1; k<number.length; k++){
                        if(number[i]+number[j]+number[k]==0) answer++;
                    }
                }
            }
    
            return answer;
        }
    }
  • 왜.. 왜 똑같지? 사람 생각은 거기서 거기인가

 


당일 회고

  • 분명 주말하고 평일은 끝났는데 왜 주말의 일이 평일까지 오는거지 쉬고싶다.