관리 메뉴

ballqs 님의 블로그

TIL - 2024년 08월 01일 - 팀 프로젝트 시작 본문

내일배움캠프/Java

TIL - 2024년 08월 01일 - 팀 프로젝트 시작

ballqs 2024. 8. 1. 21:09

오늘의 일정

9:00 ~ 10:00 - 알고리즘 코드카타
10:00 ~ 10:30 - 팀프로젝트 발제
10:30 ~ 12:00 - 팀 회의
12:00 ~ 13:00 - 점심시간
13:00 ~ 17:00 - 팀 회의

17:00 ~ 18:00 - 팀 프로젝트

18:00 ~ 19:00 - 저녁 시간
19:00 ~ 20:30 - 팀 프로젝트
20:30 ~ 21:00 - TIL 작성

알고리즘 코드카타

뒤에 있는 큰 수 찾기 알고리즘 풀이를 진행했다.

해당 문제는 정수로 이루어진 배열 numbers가 있는데 여기서 각 원소들의 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 큰수를 배열이 담아서 return 하는 방법이다.

다만 하나의 예외적인 상황이 있는데 큰수가 존재하지 않으면 -1를 담는다.

 

제한사항

  • 4 <= numbers <= 1,000,000
    • 1<= numbers[i] <= 1,000,000

입출력 예

numbers result
[2, 3, 3, 5] [3, 5, 5, -1]
[9, 1, 5, 3, 6, 2] [-1 ,5, 6, 6, -1 ,-1]

 

코드

import java.util.*;
class Solution {
    public int[] solution(int[] numbers) {
        int[] answer = new int[numbers.length];
        // 배열에 -1로 채우기
        Arrays.fill(answer , -1);
        // 스택 선언
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < numbers.length; i++) {
            // while문 첫번째 조건 : 스택의 길이가 있을때 
            // while문 두번째 조건 : 스택에서 내보내야할 값과 현재 진행중인 값을 비교
            while (stack.size() > 0 && numbers[stack.peek()] < numbers[i]) {
                // 차례대로 비교해가면서 일치하는 것들만 담기
                answer[stack.pop()] = numbers[i];
            }
            // 진행되는 모든 숫자를 스택에 담기
            stack.add(i);
        }
        return answer;
    }
}

 

풀이 흐름

[9, 1, 5, 3, 6, 2] 가 있다고 가정하자!

첫번째 흐름

  1. stack에 0를 담는다.(index)

두번째 흐름

  1. stack에 길이가 있고 두번째로 온 9 < 1 이 일치하지 않기에 넘어간다. ㄴ9는 index 기반으로 꺼낸 값이다
  2. stack에 1를 담는다.(index)

세번째 흐름

  1. stack에 길이가 있고 세번째로 온 1 < 5 가 일치하여 실행문 시작 ㄴ1는 index 기반으로 꺼낸 값이다
    1. 해당 index에 5를 담기
  2. stack에 길이가 있고 세번째로 온 9 < 5 가 일치하지 않기에 넘어간다. ㄴ9는 stack에 들어 있던 다음 출력값의 index가 가지고 있던 값
  3. stack에 2를 담는다.(index)

이런 흐름으로 값을 채워나가는 구조이다!


 

팀프로젝트 발제

ZOOM을 통해 팀 프로젝트가 발제되었다.

발제된 팀 프로젝트는 Java로 하는 팀 협업 프로젝트 수강생 점수 관리 시스템이다.

 

이 3가지 모델이 주어지며 이를 토대로 아래와 같은 기능들을 구현해야 한다.

  1. 수강생 관리
  2. 점수 관리

이 2가지로 나뉘어 지며

수강생 관리에는 2가지가 있으며

  1. 수강생 등록
  2. 수강생 목록 조회

점수 관리에는 3가지가 있다.

  1. 수강생의 과목별 시험 회차 점수를 등록
  2. 수강생의 과목별 시험 회차 점수를 수정
  3. 수강생의 특정 과목 회차별 등급을 조회

등이 있고 추가요구 사항은 다음에 개발 들어갈때 작성하겠다.


팀 회의

팀 회의를 통해 Git은 어떻게 구성할건지 branch는 사용할건지 파트 구분은 어떻게 나눌 것인지에 대한 의논을 했다.

우선 팀 과제에서는 merge 기능을 사용하는것을 권했기에 git을 무조건 적으로 사용하고 branch를 아래와 같이 나누기로 했다.

 

branch명 역할 비고
main 배포용 제출 전에 작업
dev 개발용 특정 간격에 따른 병합 및 테스트용
hojin 과목  
junhyeong Main 파일  
jonghyeok 수강생  
score-feature/jeongik 점수  
yujin 점수  

 

각 기능별 주어진 멤버변수에 적합한 데이터 타입이 무엇인지 의논하여 정하였다.

그리고 일정을 정하고 어떻게 진행할지 부족한게 있다면 어떤 방식을 채택하여 풀어나갈지 이야기했다.

 

경우에 따라 좀더 편리한 개발 방법이 없는지? 다형성 , extends 를 이용해서 묶어서 가능한지 검토 또한 진행하며 팀 회의를 마무리 지었다.


팀 프로젝트

프로젝트를 진행하면서 당장 테스트 해볼 기능이 있으면 바로 git에 올려서 연관 있는 팀원들에게 방해가 되지 않도록 전달하여 테스트를 해보았다. 

코드는 아래와 같이 작성 되었다.

 

기본 main 파일

public class CampManagementApplication {
  public List<Student> studentStore;	// 수강생
  public List<Subject> subjectStore;	// 과목
  public List<Score> scoreStore;	// 점수
  
  public static void main(String[] args) {
    // 실행내용....
  }
}

 

interface 작성

package camp;

import java.util.List;
public interface ManagementInterface<T> {

    // 1개 조회용
    T select(List<T> list , String id);

    // 전체 조회
    void selectAll(List<T> list);

    // 수정(임시구현)
    T update();

    // 삭제(임시구현)
    T delete();

    // 등록(임시구현)
    T insert();
}

 

interface 상속받은 파일 생성

package camp;

import camp.model.Subject;

import java.util.List;

// Subject를 제네릭에 사용하여 작성
public class SubjectManagement implements ManagementInterface<Subject>{
    @Override
    public Subject select(List<Subject> subjectStore , String subjectId) {
        for (Subject subject : subjectStore) {
            if (subject.getSubjectId().equals(subjectId)) {
                return subject;
            }
        }
        return null;
    }

    @Override
    public void selectAll(List<Subject> subjectStore) {
        System.out.println("==================================");
        for (Subject list : subjectStore) {
            System.out.println("과목 고유번호 : " + list.getSubjectId());
            System.out.println("과목 이름 : " + list.getSubjectName());
            System.out.println("과목 타입 : " + list.getSubjectType());
            System.out.println("==================================");
        }
    }

    @Override
    public Subject update() {
        return null;
    }

    @Override
    public Subject delete() {
        return null;
    }

    @Override
    public Subject insert() {
        return null;
    }
}

 

Subject getter setter 추가

public class Subject {
    private String subjectId;   // 과목 고유번호
    private String subjectName; // 과목 이름
    private String subjectType; // 과목 타입(필수 , 선택)
    
    // getter , setter 추가
}

 

등으로 하여 오늘 코딩 일정을 마무리 하였다.