💡 코테/99클럽

[ 99클럽 코테 스터디 23일차 TIL ] Call by Value, Call by Reference 및 프로그래머스(행렬 테두리 회전하기)

MNY 2024. 4. 20. 18:34
728x90
반응형
💡 오늘의 학습 키워드

- 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라도고 부른다.

참조를 직접 넘기기 때문에 호출자의 변수와 수신자의 파라미터는 완전히 동일한 변수이다.

메서드 내에서 파라미터를 수정하면 그대로 원본 변수에도 반영된다.

 

* 참고한 블로그

 

Java 의 Call by Value, Call by Reference

Overview Java 에서 메서드를 호출 시 파라미터를 전달하는 방법에 대해 알아봅니다. 순서는 다음과 같이 진행합니다. Call by Value, Call by Reference 차이 Java 에서의 파라미터 전달 방법 JVM 메모리에 변

bcp0109.tistory.com


오늘의 회고

문제1  : [나머지가 1이 되는 수 찾기]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

rows와 columns의 크기가 주어진 박스에서 (x1, y1, x2, y2)인 정수 4개로 표현된  2차원 배열이 주어진다.

x1행 y1열부터 x2행 y2열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전한다.

이때 회전하는 테두리에서 가장 작은 값들을 리턴하는 문제이다.

 

  • 처음 생각

회전하는 테두리를 오른쪽, 아래, 왼쪽, 위 이렇게 4개의 for문을 이용해서 최소값을 계속 업데이트 할 생각이었다.

그러고 현재값을 저장하고 다음으로 넘어가 현재 값을 다시 저장하고 아까 저장했던 현재값과 지금의 값을 swap하려고 했는데,.. 생각해보니 반복문을 돌면서 지금값이랑 지금값을 swap? 그래서 다른 방법을 찾았다.

  • 두번째 생각

일단 box가 주어지는지 이때 깨달았다. 당연히 주어지는 줄 알았다ㅠ

이번엔 다음과 같은 로직을 생각했다.

  1. box 배열 만들기
  2. 회전해야할 1차원 임의 배열 만들기
  3. 회전해야할 배열에서 최소값 찾기
  4. 회전해야할 배열 회전 후 box에 적용

일단 2번 단계에서 회전해야할 1차원 배열의 크기를 회전할 배열 크기 + 1로 주었다.

왜냐면 마지막에 회전해야할 배열을 만들며 업데이트 된 최소값을 넣어서 리턴해주려고 했다.

하지만, 이게 왠걸?

지난번부터 자꾸 어디서 ArrayIndexOutOfBoundsException이 나는지 모르겠다.

그렇지만, 나에게 주어진 한 문제당 1시간 정도의 시간은 다 사용해서 해당 문제는 여기까지 풀이하고 다른분의 풀이를 찾아보았다.

 

오늘은 문제풀이 실패ㅠ

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 어떻게 해결했는지(통과하지는 못함)
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;
    }
}

 

* 참고한 블로그

 

[프로그래머스] 행렬 테두리 회전하기 (Java)

2021 Dev-Matching: 웹 백엔드 개발자(상반기)

velog.io

 

[프로그래머스 / JAVA] Level 2 행렬 테두리 회전하기 (77485) - 𝝅번째 알파카의 개발 낙서장

rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들

blog.itcode.dev

 

  • 무엇을 새롭게 알았는지

결국 문제를 풀이하지 못하고 다른 사람들의 풀이를 보았지만, 해결방법을 찾은 느낌이 들었다.

나는 시계방향으로 라는 것에 사로잡혀서 시계방향 그대로 값을 변경하려고 했다.

하지만 다른 사람들의 풀이는 시계반대방향으로 해서 시계방향으로의 값을 덮어씌웠다.

 

그니까 회전 박스 상단만을 봤을 때,

반복문을 왼쪽에서 오른쪽이 아니라 오른쪽에서 왼쪽으로 돌게하고

현재값을 왼쪽에 있는 값으로 덮어씌우는 식이었다. 그러고 최초의 값은 따로 변수를 두어 저장하고!

 

추가적으로 함수를 만들면서 C++에서 언어를 변경하다보니

자바는 Call by Reference를 어떤 식으로 사용하지? 똑같이 사용하는지 궁금하여 찾아본 결과

자바는 Call by Reference가 없고 Call by Value로만 동작한다는 사실을 알게되었다.

세상에... Call by Reference가 없다니!!! ㅠㅜ... 이런......

 

내일 학습할 것은 무엇인지 (최대 3개)

  • 정보처리기사 실기 공부
  • 클럽99 코딩테스트(비기너) 문제풀이
  • 내배캠 CS강의 수강
728x90
반응형