ballqs 님의 블로그
TIL - 2024년 08월 08일 - 팀 프로젝트 종료 및 KPT 작성 본문
오늘의 일정
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의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.
입출력 예
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;
}
}
}
}
팀 프로젝트 발표 준비 및 발표
발표 관련 내용이라 적을 내용이 없긴 하지만 발표시 몇분 걸리는지 체크 후 대본을 수정하면서 대비하였고 발표했다.
여러 피드백을 받을 예정이고 해당 프로젝트의 링크는 아래와 같다.
KPT 작성
'내일배움캠프 > Java' 카테고리의 다른 글
TIL - 2024년 08월 07일 - 팀 프로젝트 7일차(PPT 작성시 문제 발생) (0) | 2024.08.07 |
---|---|
TIL - 2024년 08월 02일 - 팀 프로젝트 2일차 (0) | 2024.08.02 |
TIL - 2024년 08월 01일 - 팀 프로젝트 시작 (0) | 2024.08.01 |
TIL - 2024년 07월 19일 공부한 내용 정리하기(int long BigInteger) (0) | 2024.07.19 |
TIL - 2024년 07월 18일 공부한 내용 정리하기(Set) (0) | 2024.07.18 |