Call by Value, Call by Reference 및 프로그래머스(행렬 테두리 회전하기)
💡 오늘의 학습 키워드
- Call by Value
- Call by Reference
- 프로그래머스
* 행렬 테두리 회전하기 : 미들러 문제(Level 1)
Call by Value
: 자바는 오직 Call by Value로만 동작한다.
Call by Value는 메서드를 호출할 때 값을 넘겨주기 때문에 Pass by Value라고도 부른다.
메서드를 호출하는 호출자(Caller)의 변수와 호출 당하는 수신자(Callee)의 파라미터는 복사된 서로 다른 변수이다.
값만을 전달하기 때문에 수신자의 파라미터를 수정해도 호출자의 변수에는 아무런 영향이 없다.
Call by Reference
Call by Reference는 참조(주소)를 직접 전달하며 Pass by Reference라도고 부른다.
참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수이다.
메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영된다.
* 참고한 블로그
오늘의 회고
문제1 : [나머지가 1이 되는 수 찾기]
- 어떤 문제가 있었고, 나는 어떤 시도를 했는지
rows와 columns의 크기가 주어진 박스에서 (x1, y1, x2, y2)인 정수 4개로 표현된 2차원 배열이 주어진다.
x1행 y1열부터 x2행 y2열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전한다.
이때 회전하는 테두리에서 가장 작은 값들을 리턴하는 문제이다.
- 처음 생각
회전하는 테두리를 오른쪽, 아래, 왼쪽, 위 이렇게 4개의 for문을 이용해서 최소값을 계속 업데이트 할 생각이었다.
그러고 현재값을 저장하고 다음으로 넘어가 현재 값을 다시 저장하고 아까 저장했던 현재값과 지금의 값을 swap하려고 했는데,.. 생각해보니 반복문을 돌면서 지금값이랑 지금값을 swap? 그래서 다른 방법을 찾았다.
- 두번째 생각
일단 box가 주어지는지 이때 깨달았다. 당연히 주어지는 줄 알았다ㅠ
이번엔 다음과 같은 로직을 생각했다.
- box 배열 만들기
- 회전해야할 1차원 임의 배열 만들기
- 회전해야할 배열에서 최소값 찾기
- 회전해야할 배열 회전 후 box에 적용
일단 2번 단계에서 회전해야할 1차원 배열의 크기를 회전할 배열 크기 + 1로 주었다.
왜냐면 마지막에 회전해야할 배열을 만들며 업데이트 된 최소값을 넣어서 리턴해주려고 했다.
하지만, 이게 왠걸?
지난번부터 자꾸 어디서 ArrayIndexOutOfBoundsException이 나는지 모르겠다.
그렇지만, 나에게 주어진 한 문제당 1시간 정도의 시간은 다 사용해서 해당 문제는 여기까지 풀이하고 다른분의 풀이를 찾아보았다.
오늘은 문제풀이 실패ㅠ
- 어떻게 해결했는지(통과하지는 못함)
import java.util.Arrays;
class Solution {
public int[][] createBox(int rows, int columns) {
int[][] box = new int[columns][rows];
for (int column = 0; column < columns; column++) {
for (int row = 0; row <= rows; row++) {
box[column][row] = column * rows + row + 1;
}
}
return box;
}
public int[] findArr(int[][] box, int[] queries) {
int size = (queries[3]-queries[1])*2 + (queries[2]-queries[0])*2 + 1;
int[] temp = new int[size];
int min = 10000;
int idx = 0;
for (int row = queries[1]; row < queries[3]-1; row++) {
int column = queries[0];
temp[idx] = box[column][row];
if (min > temp[idx])
min = temp[idx];
idx++;
}
for (int column = queries[0]; column < queries[2]-1; column++) {
int row = queries[1];
temp[idx] = box[column][row];
if (min > temp[idx])
min = temp[idx];
idx++;
}
for (int row = queries[3]; row > queries[1]+1; row--) {
int column = queries[2];
temp[idx] = box[column][row];
if (min > temp[idx])
min = temp[idx];
idx++;
}
for (int column = queries[2]; column > queries[0]+1; column--) {
int row = queries[1];
temp[idx] = box[column][row];
if (min > temp[idx])
min = temp[idx];
idx++;
}
temp[size-1] = min;
return temp;
}
public int[] solution(int rows, int columns, int[][] queries) {
int cycle = queries.length;
int[][] box = new int[columns][rows];
int[] answer = new int[cycle];
box = createBox(rows, columns);
for (int i = 0; i < cycle; i++) {
int[] temp = findArr(box, queries[i]);
answer[i] = temp[temp.length-1];
System.out.println(Arrays.toString(answer));
// box = rotationBox(box, queries[i], temp);
}
return answer;
}
}
* 참고한 블로그
- 무엇을 새롭게 알았는지
결국 문제를 풀이하지 못하고 다른 사람들의 풀이를 보았지만, 해결방법을 찾은 느낌이 들었다.
나는 시계방향으로 라는 것에 사로잡혀서 시계방향 그대로 값을 변경하려고 했다.
하지만 다른 사람들의 풀이는 시계반대방향으로 해서 시계방향으로의 값을 덮어씌웠다.
그니까 회전 박스 상단만을 봤을 때,
반복문을 왼쪽에서 오른쪽이 아니라 오른쪽에서 왼쪽으로 돌게하고
현재값을 왼쪽에 있는 값으로 덮어씌우는 식이었다. 그러고 최초의 값은 따로 변수를 두어 저장하고!
추가적으로 함수를 만들면서 C++에서 언어를 변경하다보니
자바는 Call by Reference를 어떤 식으로 사용하지? 똑같이 사용하는지 궁금하여 찾아본 결과
자바는 Call by Reference가 없고 Call by Value로만 동작한다는 사실을 알게되었다.
세상에... Call by Reference가 없다니!!! ㅠㅜ... 이런......
내일 학습할 것은 무엇인지 (최대 3개)
- 정보처리기사 실기 공부
- 클럽99 코딩테스트(비기너) 문제풀이
- 내배캠 CS강의 수강