알고리즘

프로그래머스 181913 문자열 여러번 뒤집기

yeooniyeoon 2024. 1. 19. 17:49
728x90
SMALL

https://school.programmers.co.kr/learn/courses/30/lessons/181913#

 

프로그래머스

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

programmers.co.kr

 

 

 

 

foreach문을 사용해 queries값을 하나씩 받아와 answerArray에 tempArray의 값을 query[1]값부터 query[0]까지 대입하도록 했다.

 

처음 코드는 아래와 같이 작성했다.

public String solution(String my_string, int[][] queries) {
        char[] tempArray = my_string.toCharArray();
        char[] answerArray = tempArray;

        for (int [] query:queries) {
            for (int i = 0; i <= query[1] - query[0]; i++)
                answerArray[query[0] + i] = tempArray[query[1] - i];
            tempArray = answerArray;
        }

        return String.copyValueOf(answerArray);
}

 

 

위 코드는 결과가 제대로 출력되지 않았다.

for문을 처음 돌 때는 제대로 값이 넣어졌지만 그 이후부터는

answerArray의 값만 변경되어야 하는데 tempArray의 값이 같이 변경되었다.

 

두가지 이유가 있는데

첫번째는 처음 answerArray를 선언하고 값을 할당할 때 tempArray를 값으로 주었는데

이런식으로 값을 주는 과정에서 tempArray와 answerArray가 같은 객체를 참조하게 되었기 때문이다.

 

마찬가지로 두번째 이유는 이중포문에서 내부 포문이 다 돌고나면 tempArray에 answerArray의 값을 대입하도록 하였는데

이 과정에서 tempArray가 answerArray와 같은 객체를 참조하게 되었기 때문이다.

그래서 answerArray의 값을 변경하면 tempArray값이 같이 변경되었던 것이다.

answerArray를 직접 대입하는 대신 clone() 메소드나 Array.copyOf() 메소드를 사용하는 방법이 있었는데

Array.copyOf는 Object 배열에 대해서만 사용가능하다고 하여

배열의 자료형에 상관없이 사용가능한 clone() 메소드를 사용하여 해결하였다.

 

class Solution {
    public String solution(String my_string, int[][] queries) {
        char[] tempArray = my_string.toCharArray();
        char[] answerArray = my_string.toCharArray();

        for (int [] query:queries) {
            for (int i = 0; i <= query[1] - query[0]; i++)
                answerArray[query[0] + i] = tempArray[query[1] - i];
            tempArray = answerArray.clone();
        }

        return String.copyValueOf(answerArray);
    }
}

 

 

 

728x90
반응형
SMALL