'4월 25일' 아홉 번째 기록 [TIL]

가은·2024년 4월 25일
0

I Learned [본 캠프]

목록 보기
10/135
post-thumbnail

👩‍🏫 오늘의 출석

❓네 번째, 9 to 9을 해 본 소감❓

어제 분명 올린 여덟 번째 글이 오늘 보니 안 올라가 있어서 지금 좀 정신력이 바사삭... 이지만 그래도 오늘의 기록은 또 열심히 적어야 하니까 눈물 조금 닦고 시작해야겠다. 오늘은 오전에 강의 듣고 코드카타 하고고 나니 오전 시간이 없다고 생각하는 게 맞을 정도도 개인적으로 학습할 시간이 줄었고 그렇게 되니 3시간이 없다고 어제보다 촉박하게 시간이 흘러가는 것 같고, 오늘 할 일도 몇 개 못 한 느낌이 들었다. 그런데 생각해 보면 또 그렇게 아무것도 안 한 건 아닌데 말이다. 문제 하나가 안 풀려서 조금 오래 잡고 있어서 그런가? 시간이 더 부족하고, 많은 일을 하지 못한 기분이 들었다.

📑오늘 학습한 내용

9시부터 10시 30분까지는 알고리즘 세션이 있어서 알고리즘 관련 강의를 들었다.
그리고 11시(10분)부터는 알고리즘 코드카타라는 걸 진행했다. 1시간 동안 그날 풀어야 하는 알고리즘 문제 하나를 푸는 시간으로 나는 전에 파이썬으로 몇 문제 풀어보았던 거기도 하고, 초반이라 쉬운 문제를 푸는 거라 10분도 안 걸려서 문제를 풀고 나머지 시간 동안 지난달에 실패했던 백준허브를 사용해서 프로그래머스랑 깃허브를 연동하는 걸 다시 시도했다. 지난달에는 모두가 같은 오류를 겪고 있었기도 하고 누구는 해결했다는데 나는 그 방법을 해도 안 돼서 포기했었는데 오늘은 매니저님께 가능하다는 걸 확인하고 다시 처음부터 세팅해서 진행을 하니 드디어 성공했다! 이제 프로그래머스 다시 열심히 풀어야지!

🧩오늘의 알고리즘 : 나이 출력🧩

class Solution {
    public int solution(int age) {
        int current = 2022;
        int birth = current - age + 1;
        return birth;
    }
}

이후에는 4주 차 강의를 듣고 4주 차 과제를 진행했다. 그런데 4주 차 과제가 나는 어려워서 이 부분에서도 시간을 꽤 들여서 잡고 있었다.

🎈4주차 과제 중

import java.util.regex.Pattern;

// Parser 클래스 선언
public class Parser {
    // 연산자를 찾기 위한 정규표현식 상수 선언
    private static final String OPERATION_REG = "[+\\-*/]";
    // 숫자를 찾기 위한 정규표현식 상수 선언
    private static final String NUMBER_REG = "^[0-9]*$";

    // 첫 번째 숫자를 파싱하여 설정하는 메서드
    public Parser parseFirstNum(String firstInput) throws Exception {
        // 입력된 값이 숫자 형식이 아닌 경우 예외 처리
        if (!Pattern.matches(NUMBER_REG, firstInput)) {
            throw new BadInputException("정수값");
        }
        // 입력된 값이 숫자 형식일 경우, 해당 값을 정수로 변환하여 Calculator 클래스의 첫 번째 숫자로 설정
        this.calculator.setFirstNumber(Integer.parseInt(firstInput));
        // 현재 객체 반환 (method chaining을 위함)
        return this;
    }

    // 두 번째 숫자를 파싱하여 설정하는 메서드
    public Parser parseSecondNum(String secondInput) throws Exception {
        // 입력된 값이 숫자 형식이 아닌 경우 예외 처리
        if (!Pattern.matches(NUMBER_REG, secondInput)) {
            throw new BadInputException("정수값");
        }
        // 입력된 값이 숫자 형식일 경우, 해당 값을 정수로 변환하여 Calculator 클래스의 두 번째 숫자로 설정
        this.calculator.setSecondNumber(Integer.parseInt(secondInput));
        // 현재 객체 반환 (method chaining을 위함)
        return this;
    }  
}

❣️개인과제

✔️다섯 번째 요구사항

  • 연산 결과 10개를 저장할 수 있는 배열을 선언 및 생성하고 연산의 결과를 저장합니다.
    • 연산의 결과를 비어있는 곳에 저장하기 위해 저장할 때마다 count 합니다.
  int[] intArray = new int[10];
        int count = 0;

  if (count < 10) {  //10번 이하의 연산 결과값일 때
                intArray[count++] = result;
            } else { //배열 크기를 초과한 경우
                System.out.println("더 이상 결과를 저장할 수 없습니다.");
                
        System.out.println("저장된 결과값:");  // 배열에 저장된 결과값 확인하기
        for (int i = 0; i < count; i++) {
            System.out.println(intArray[i]);
        }

✔️여섯 번째 요구사항 🚨3번의 시도 끝에 성공🚨

  • 연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가 저장될 수 있도록 소스 코드를 수정합니다.
    • 현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고 새로운 결과 값이 마지막 index에 저장될 수 있도록 구현합니다.
			/*1차 시도 : 실패*/
   			if (count < 10) {  //10번 이하의 연산 결과값일 때
                intArray[count++] = result;
            } else if (count >= 10) { //배열 크기를 초과한 경우
              intArray[0] = Integer.parseInt(null);       //0번째 인덱스 값을 없앰
              int[] copyOfInt = Arrays.copyOf(intArray, intArray.length - 1);  //배열 값 재배치
              intArray[count++] = result;  // 새로운 값 마지막 인덱스에 배치,,,
            }
			/*2차 시도 : 실패*/
            // 결과값 저장 및 인덱스 업데이트
            if (count < 10) { // 저장된 결과값이 10개 미만인 경우
                intArray[count++] = result; // 배열에 결과값 저장하고 count 증가
            } else { // 이미 10개의 결과값이 저장된 경우
                intArray[index] = result; // 가장 오래된 결과값 덮어쓰기
                index = (index + 1) % 10; // 다음 인덱스로 이동 (순환)
            }
			/*튜터님께 반복문을 사용하라는 힌트를 얻어 해결*/
			// 결과값 저장 및 인덱스 업데이트
            if (count < 10) { // 저장된 결과값이 10개 미만인 경우
                intArray[count++] = result; // 배열에 결과값 저장하고 count 증가
            } else { // 이미 10개의 결과값이 저장된 경우
                // 이전 결과값을 한 칸씩 앞으로 이동
                for (int i = 0; i < intArray.length - 1; i++) {
                    intArray[i] = intArray[i + 1];
                }
                intArray[intArray.length - 1] = result; // 마지막 인덱스에 새 결과값 저장
            }

✔️일곱 번째 요구사항

  • 연산 결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
    • JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)
    • “remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.
ArrayList<Integer> intArray = new ArrayList<Integer>();

 		 /*ArrayList에 연산 결과 저장할 수 있도록 구현*/
          intArray.add(result);
          System.out.println(intArray); //ArrayList에 잘 저장이 되었는지 확인

          System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
          /*“remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현*/
          String answer = sc.nextLine();
            if (answer.equals("remove")) {
                intArray.remove(0);
            }

✔️여덟 번째 요구사항

  • inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
    • foreach(향상된 for문)을 활용하여 구현 해봅니다.
      		System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
            String reply = sc.nextLine();

            if (reply.equals("inquiry")) {
                for (int num : intArray) {
                    System.out.println(num);
                }
            }

드디어 Level 1 계산기 만들기 개인 과제 끝!

위의 과제를 하다가 7시부터 8시까지는 요구사항 7번을 풀기 전에 컬렉션 관련 유튜브 영상을 보며 컬렉션에 대해 다시 한 번 정리했다.

🗝️여기서 잠깐! "Set VS List"

set : 중복된 값 저장하지 않으며 순서대로 저장되는 것이 보장 되지 않음
list : 입력된 모든 값을 순서대로 저장함

- A.containsAll(B); 부분집합에 관해 묻는 것으로 A가 B의 모든 값을 가지고 있는지에 대한 결과 값을 boolean 값으로 출력.

- A.addAll(b); A와 B의 합집합에 대해 묻는 것으로 두 개의 List를 합칠 때 사용

- A.retainAll(B); A와 B의 교집합으로 공통 요소만 남기고 나머지는 A에서 제거함

- A.removeAll(B); A에서 B와 겹치는 값을 뺀 나머지만 출력함, 차집합

컬렉션 관련 이미지 출처 : 생활코딩

0개의 댓글