[LV 0] 배열 뒤집기, 공 던지기

devKyoun·2023년 4월 22일
2
post-thumbnail

배열 뒤집기 (LV 0)

말 그대로 배열을 뒤집는 Solution 함수를 완성해야 한다.

처음 프로그래머스를 하는지라, 여기에 main 함수 두드려박고 했는데 오류가 뜨고 그래서 당황 했다.
근데 생각보다 엄청 간편한게 main에서 정상적으로 입력 된다고 했을때, 그 입력 조건을 정확하게 처리 할 수 있도록 내가 만들기만 하면 정답이 된다는 것이다.🤣🤣

자, 그러면 입력이 들어 왔을때 생각 해보자.

	int[] answer = {}
    //Code
    return answer;

우선 solution 함수의 리턴 타입과 return answer를 보니, 뒤집힌 배열은 answer이다.
그러나, 현재 answer 배열은 어떠한 배열도 참조하지 않고 있다. (비어 있는 참조변수_answer)

그래서 우선 answer 배열을 생성해 주도록 하자.

   	int[] answer = new int[num_list.length];

생성을 한 뒤에 값을 대입할때,
answer배열은 인덱스 0부터 마지막까지 num_list 배열의 마지막 인덱스부터 0까지 값을 입력 받는다.

	 for(int i=0; i<num_list.length; i++)
            answer[i] = num_list[num_list.length - 1 - i];

배열 뒤집기 결과



공 던지기 (LV 0)

	class Solution {
    public int solution(int[] numbers, int k) {
        int answer = 0;
        return answer;
    }
}

이것은 아마, 직관적으로 봤을때 알고리즘 원형 큐로 풀 수 있을 것 같긴한데, 잘 기억이 나지 않는다. 아직 숙련도를 다시 끌어올리는 중이라 다른 방식을 택하고 나중에 원형 큐를 다시 습득하면 그때 재업로드 해보겠다.

방금 말한 다른 방식은 배열의 길이와 나머지(%) 연산을 활용하면 풀 수 있을 것 같다.
보통 원에 관련된 문제는 대부분 나머지 연산과 연관돼있다. 한바퀴 돌면은 다시 제자리로 오는 것을 표현하는데 직관적이며 심지어 원형큐도 어쨋거나 나머지 연산으로 구현하는 방법이 있기 때문이다.

제한사항을 봐보자.
numbers 정수 배열의 첫번째와 마지막 번호는 실제로 바로 옆에 있다니, 그냥 원모양으로 연결 돼 있구나 생각하면 된다.

그러면 그러한 방법을 위에서 말한 거와 같이 구현하면된다.

정수 배열의 크기 : 5 라고 치자.
그러면, 배열의 형태는 [ n1, n2, n3, n4, n5 ] 일텐데
변수 int i 가 인덱스 0부터 시작해서 마지막 인덱스인 4까지 간다치자
마지막 인덱스의 값 n5에서 다시 n1으로 가기 위해선 어떻게 해야 할까?

numbers [ i % numbers.length ] 으로 한다면 마지막 인덱스에서 배열의 크기와 같은 인덱스가 되는 순간 첫 인덱스로 돌아 갈 것이고 이의 논리는 순환하는 원과 같아지는 것이다.

이제 두번째 k를 어떻게 처리할지 생각 해보자.

공은 1번 친구부터 던지는데 오른쪽으로 한명을 건너뛰고 그다음 사람에게만 던진다고 한다.
그럼 친구들이

[1번 친구, 2번 친구, 3번 친구, 4번 친구, 5번 친구]

있다고 가정하면, 공이 인덱스가 2 증가 하는 동안 몇번째로 던졌는지 관련된 k변수는 인덱스가 1번 증가한다는 소리다.

즉 k(몇번째 던졌는가?)가 2이면 2번째 던진 친구의 번호를 return 한다는 것던데,
그럼 첫번째 던진 친구로부터 공을 받아 두번째 던진다면 공은 인덱스가 2번 증가하니까
3번 친구와 같은 인덱스를 가지게 된다.

그럼, 2번째 던진 친구의 번호는 3번인 것.

class Solution {
    public int solution(int[] numbers, int k) {
        int answer = 0;
        
        for(int i=0, ball_index = 0; i<k; i++, ball_index+=2)
            answer = numbers[ball_index%numbers.length];
            
        return answer;
    }
}


profile
Game Developer

0개의 댓글