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; } }
- 왜.. 왜 똑같지? 사람 생각은 거기서 거기인가
당일 회고
- 분명 주말하고 평일은 끝났는데 왜 주말의 일이 평일까지 오는거지 쉬고싶다.