관리 메뉴

ballqs 님의 블로그

TIL - 2024년 08월 08일 - 팀 프로젝트 종료 및 KPT 작성 본문

내일배움캠프/Java

TIL - 2024년 08월 08일 - 팀 프로젝트 종료 및 KPT 작성

ballqs 2024. 8. 8. 17:08

오늘의 일정

9:00 ~ 10:00 - 알고리즘 코드카타
10:00 ~ 12:00 - 팀 프로젝트 발표 준비
12:00 ~ 13:00 - 점심시간
13:00 ~ 17:00 - 팀 프로젝트 발표
17:00 ~ 18:00 - KPT 작성

18:00 ~ 19:00 - 저녁시간

19:00 ~ 22:00 - KPT 작성
22:00 ~         - TIL 작성

알고리즘 코드카타

이번 문제는 난이도가 조금 있어보였다.

프로그래머스의 쿼드압축 후 개수 세기 라는 문제였고 풀어봤다.

해당 문제는 2^n * 2^n 크기의 2차원 배열이 있고 안에는 0과 1이 값들이 무작위로 들어가 있다.

글로 설명보다는 아래의 입출력 예 설명으로 보는게 가장 빠를 것이다.

 

제한사항

    • arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
      • arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.
      • arr의 각 행에 있는 모든 값은 0 또는 1 입니다.

입출력 예

arr result
[[1,1,0,0],[1,0,0,0],[1,0,0,1],[1,1,1,1]] [4,9]
[[1,1,1,1,1,1,1,1],[0,1,1,1,1,1,1,1],
[0,0,0,0,1,1,1,1],[0,1,0,0,1,1,1,1],
[0,0,0,0,0,0,1,1],[0,0,0,0,0,0,0,1],
[0,0,0,0,1,0,0,1],[0,0,0,0,1,1,1,1]]
[10,15]

 

입출력 예 설명

입출력 예 #2

  • 다음 그림은 주어진 arr을 압축하는 과정을 나타낸 것입니다.

 

풀이과정

주어진 행의 개수가 2의 거듭 제곱수 형태라서 반복 함수를 만들어서 2로 나눠가며 재귀함수를 돌리면 될거 같았다. 재귀함수에서는 배열의 총길이를 맨 처음에 받고 반복문에서는 그 주어진 총길이 만큼 빼면서 돌면서 점점 나누기 2를 하면서 재귀 형식으로 반복문 도는 걸로 진행했다. 그리고 파트 반복문이라는 걸 만들어서 쿼드압축하기 적합한지 아닌지 논리 연산자 값을 반환 받아 List에 넣고 검증 후 총 결과값을 반환했다.

 

코드

import java.util.*;

class Solution {
    List<int[]> compressionList = new ArrayList<>();
    int[][] array;
    boolean[][] visiting;
    int len;
    
    public int[] solution(int[][] arr) {
        int[] answer = new int[2];
        array = arr;
        len = array[0].length;
        visiting = new boolean[len][len];
        
        // 주어진 배열의 총 길이를 초기값으로
        compression(len);
        
        for (int i = 0; i < compressionList.size(); i++) {
            answer[compressionList.get(i)[3]]++;
        }
        
        return answer;
    }
    
    public void compression(int num) {
        if (num > 0) {
            // len - num 만큼 반복문
            for (int i = 0; i <= len - num; i += num) {
                for (int j = 0; j <= len - num; j += num) {
                    // 압축여부 검증 및 파트반복문을 통해 압축해도 되는지 검증
                    if (!visiting[i][j] && partLoop(i , j , num , array[i][j])) {
                        // 압축하기
                        visitingCheck(i , j , num);
                        // List에 담기
                        compressionList.add(new int[]{i , j , num , array[i][j]});
                    }
                }
            }
            compression(num / 2);
        }
    }
    
    // 파트반복문
    public boolean partLoop(int xStart , int yStart , int add , int number) {
        for (int i = xStart; i < xStart + add; i++) {
            for (int j = yStart; j < yStart + add; j++) {
                // 받아온 number값과 다르기만 하면 바로 false 반환
                if (number != array[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
    // 압축여부
    public void visitingCheck(int xStart , int yStart , int add) {
        for (int i = xStart; i < xStart + add; i++) {
            for (int j = yStart; j < yStart + add; j++) {
                visiting[i][j] = true;
            }
        }
    }
}

 


팀 프로젝트 발표 준비 및 발표

발표 관련 내용이라 적을 내용이 없긴 하지만 발표시 몇분 걸리는지 체크 후 대본을 수정하면서 대비하였고 발표했다.

여러 피드백을 받을 예정이고 해당 프로젝트의 링크는 아래와 같다.

수강생 관리 프로젝트

 

GitHub - ballqs/23-camp-management-app

Contribute to ballqs/23-camp-management-app development by creating an account on GitHub.

github.com


KPT 작성