GreatAlgorithm-Study / AlgorithmStudy

🌟알고리즘 대장정🌟
6 stars 4 forks source link

[10주차_월요일] 회전하는 빙하 #127

Closed yeahdy closed 4 days ago

yeahdy commented 1 week ago
### 🤔 시간복잡도 고려사항

### 💡 풀이 아이디어
KodaHye commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

Level에 따라 화전하는 정도가 달라지나, 규칙은 동일함 (2L * 2L 만큼 선택하여 2L−1 * 2L−1만큼 잘라 4등분하여 회전)

Jewan1120 commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

icegosimperson commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

1) 격자 회전

2) 빙하 회전

baexxbin commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

yeongleej commented 1 week ago

🤔 시간복잡도 고려사항

=> bfs 탐색: O(N* N)이므로 완전탐색 가능 => 시뮬레이션 가능

💡 풀이 아이디어

public static void rotate(int S, int sx, int sy) {
    int ts = S / 2;
    for(int x=sx; x<sx+S; x+=ts) {
        for(int y=sy; y<sy+S; y+=ts) {
            int ox = x - sx;                              // 원점 이동
            int oy = y - sy;
            int nx = oy;                                  // 시계방향 회전
            int ny = S - ts - ox;
            t[nx+sx][ny+sy] = g[x][y];                   // 회전된 새로운 시작점 위치
            int tx = (nx+sx)-x;                               //  새로운 시작점 위치의 이동 벡터 구하기
            int ty = (ny+sy)-y;

                        // 내부 사각형 원소들 새로운 시작점 기준으로  덩어리 이동
            for(int i=x; i<x+ts; i++) {
                for(int j=y; j<y+ts; j++) {
                    t[i+tx][j+ty] = g[i][j];
                }
            }
        }
    }
}

image image

yeahdy commented 1 week ago

🤔 시간복잡도 고려사항

💡 풀이 아이디어

  1. 얼음 회전하기

    1. 회전한 얼음을 저장하기 위한 임시 배열 생성
    2. level 에 따라 2^L−1* 2^L−1 만큼 4등분
    3. 나뉜 구간 별로 회전을 위해 계산된 레벨을 활용해서 각 왼쪽 윗 모서리를 기준점으로 잡음. 왼쪽위 > 오른쪽위으로 이동 오른쪽위 > 오른쪽아래로 이동 오른쪽아래 > 왼쪽아래 왼쪽아래 > 왼쪽위로 이동
    4. 각 구간 별로 얼음 회전하기 나뉜 구간 안에서 정해진 방향성을 따라 계산된 레벨 만큼 회전 (1레벨:1번, 2레벨:4번, 3레벨:8번)
    5. 얼음을 모두 회전한 후 임시 배열 > 원본 배열로 복사
  2. 얼음 녹이기 상하좌우 완전탐색을 통해 3개 미만일 경우 얼음 녹이기

  3. 얼음 군집 계산하기 BFS 탐색을 통해 이어진 얼음 군집의 최대치 계산하기

얼음 군집을 BFS 로 방향 탐색할 때 1개는 군집으로 포함되지 않는 부분 현재 위치에 대한 얼음의 크기와 방문처리 조건문 처리를 제대로 못해서 헤맸네요...