[Java 풀스택 과정 강의] 3월 3일

부트캠프 일지/Java 풀스택 과정 강의
2026.03.03
※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.
일지이기 때문에 일기의 성격이 더 강합니다.

 

 

사실 알고리즘 강의는 이론 자체보다는 좀 더 실습의 양이 많아서 코테런에서의 비중이 높다. 따라서 강의 일지는 간략하게만 한다. 2차원 배열 관련 복습이 있었는데 그 부분에 대해서는 제외했다.

 

델타 이동

동할 방향을 쌍으로 미리 정의해두고 활용하는 기법이다. 반복문을 통해 방향 배열을 순회하며 인접한 좌표를 효율적으로 탐색한다.

 

프로그래머스에서 사용했던 정수를 나선형으로 배치하기 문제의 정확한 해법은 델타 이동을 이용한 것이다.

 

[코딩 테스트 RUN] 코딩 기초 트레이닝 25일차: 완주

 

[코딩 테스트 RUN] 코딩 기초 트레이닝 25일차: 완주

⚠️ 주의!프로그래머스에서 낸 코딩 문제에 대한 해답이 들어있습니다.열람 시 주의해주세요. 완주했다.이제부터는 다른 코딩 테스트와 함께한다. 수업에서 SWEA 등을 배우고 있다. 정수를 나선

bbbbabbbababababa.tistory.com

 

델타 이동의 핵심은 바로 방향을 정하는 델타 배열이다.

 

int[] dr = {-1, 1, 0, 0};
int[] dc = {0, 0, -1, 1};

 

이런 식으로 방향(4방향일 경우 상하좌우고, 8방향까지 가능하다)에 따른 진전을 표기하는 형태인데, 1은 전진, -1은 후진, 0은 변화 없음이라는 뜻이다.

 

이렇게 탐색을 하다보면 당연히 경계선에 부딪히게 되는데, 이에 따라서 유효 범위 체크를 하게 된다. 기본적으로 델타 탐색에서 들어가는 유효범위는 4방향에 대한 체크라고 봐도 좋다. 그 전에, 이 체크를 하게 되는건 이동하는 본인이 아니라 next가 된다. 즉, 발을 뻗을 수 있는갸에 대한 체크를 확인하고(그렇지 않으면 바운더리 에러가 뜬다) 맞다면 진전하는 식이다.

 

for (int i = 0; i < 4; i++){
	int nr = r + dr[i];
    int nc = c + dc[d];
    
    if(nr >= 0 && nr < ROW && nc >= 0 && nr < COL) {
    	// 여러 상황에서 아래 arr[nr][nc]를 사용할 수 있다.
        arr[nr][rc];
     
    }
}

 

아래 경계선 체크는 따로 메서드로 분리하여 사용하기도 한다(여러 번 사용할 경우)

8방향일 경우, 좌상 좌하 우상 우하의 4가지 경우가 더 추가된다.

 

 

행렬 연산

행렬연산은 행과 열을 바꾸는 변환이다. (r, c) → (c, r)과 같은 형태로, 크기 또한 변화된다. 일단 이 행렬 연산을 하기 위해서는 새 배열에 저장을 해야하고, 그 후에 스왑을 사용해야한다. 이 새 배열이 선택 정렬 시의 temp와 비슷한 역할을 한다.

 

https://bbbbabbbababababa.tistory.com/90#%EC%84%A0%ED%83%9D-%EC%A0%95%EB%A0%AC

 

[Java 풀스택 과정 강의] 2월 26일

※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.일지이기 때문에 일기의 성격이 더 강합니다. 1차원 배열사실 배열은 이미 배운 부분이 있어서 간단한 부분만 톺아

bbbbabbbababababa.tistory.com

 

그리고 이 행렬 연산을 사용해서 90도로 회전하거나 180도로 회전하는 등의 방법이 있다. 수도코드는 아래와 같다고 할 수 있다.

 

90도 회전

b[c][n-1-r] = a[r][c]

 

180도 회전

b[n-1-r][m-1-c] = a[r][c]

 

270도 회전

b[m-1-c][r] = a[r][c]

 

 

배열 복사

배열의 복사는 사실 java 시간에도 말했지만 다시 확인차 말한다.

 

얕은 복사

// 1차원 얕은 복사
int[] a = {1, 2, 3};
int[] b = a;

 

1차원에서 얕은 복사는 이정도다.

 

 

깊은 복사

여러 방법이 있다.

 

int[] a = {1, 2, 3};

// 1. for
int[] c1 = new int[a.length];
for(int i=0; i<a.length; i++) { c1[i] = a[i]; }

// 2. clone (1차원 깊은 복사)
int[] c2 = a.clone();

// 3. Arrays.copyOf - system arraycopy 기반 짱 빠름
int[] c3 = Arrays.copyOf(a, a.length);

c3[2] = 99;
System.out.println(Arrays.toString(a)); // {1, 2, 3}
System.out.println(Arrays.toString(c3)); // {1, 2, 99}

 

for문, clone, Arrays.copyof, 그리고 system.arraycopy가 존재한다.

다만 이 깊은 복사 중 주의할 것은 2차원을 포함한 N차원 복사인데, 단순히 1차원 복사를 했다고 해서 깊은 복사가 되는 것이 아니라, 1차원에서 들어가서 2차원 배열 또한 복사해줘야 한다. 따라서 for문으로 순회하거나, 1차원에서 들어가 Arrays.copyOf 등을 사용해야 한다.