<문제 제시>
<문제설명>
머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다.
공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다.
친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때,
k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.
<예시 입출력>
<문제 해결 과정>
<테스트케이스>
[1,2,3,4,5,6] 에 횟수 5번일 경우
1 - 3 - 5 / 1 - 3 해서 3의 인덱스값인 2가 리턴되어야함
Try 1)
public static int solution(int[] numbers, int k) {
int answer = 0;
int cnt = 0;
int i = 0 ;
int r = 0;
while(true) {
for(i = r; i < numbers.length; i+=2) {
// i인덱스가 numbers 배열의 두번째 끝값에 도달하면, i를 초기화
if(i == (numbers.length - 2)){
System.out.println("'두번째 끝값'이어서 다음으로 넘어갑니다. numbers[" + i + "] = " + numbers[i] + ", k값은 = " + k);
r = 0;
continue;
}
// i인덱스가 numbers 배열의 끝값에 도달하면, i를 1로 초기화 (인덱스 두번째 값부터 시작)
else if(i == (numbers.length - 1)) {
System.out.println("'끝값'이어서 다음으로 넘어갑니다. numbers[" + i + "] = " + numbers[i] + ", k값은 = " + k);
r = 1;
continue;
}
System.out.println("점프하는 중 numbers[" + i + "] = " + numbers[i] + ", k값은 = " + k);
if(k == 1) {
answer = i + 1;
break;
}
}
if(k == 1) break;
}
return answer;
}
처음에는 배열의 다음 패턴으로 넘어갈때 i 값을 초기화 해주는 과정에 있어서
for문이 개입하지 않을거라 생각했던 것이 오산이었다.
for문에서는 초기값을 설정하고, for문이 반복되는 한 i의 값은 어느정도 가변성이 있기때문에
r이라는 변수를 새로 만들어 조건에 부합할때마다 r값을 초기화 시킨 후 그 r값을 i에 넣어주었다.
또한 조건문을 만나면 k--; 로직을 막기위해 continue처리를 하여 반복문의 처음으로 돌아가 진행하도록 하였다.
인덱스 i는 0번부터 시작하기때문에 answer에 누적할때는 공을 던지는 사람의 '번호'이므로
numbers 배열의 1,2,3... 순서에 따라 +1을 해주었다.
k번째로 공을 던진 후의 사람이 아닌, k번째로 공을 던지는 사람을 찾는 것이므로
k부터 k횟수가 될때까지 감소시키면 k == 1일때 횟수가 종료되므로
k == 1로 break문을 처리하였다.
조건문과 일반 진행문의 위치도 중요하였는데, 조건문의 처리를 지나오고나서야 일반문이 진행될 수 있도록 수정하였다.
일반문 후에 조건문이 처리되도록했을때는 조건문과 동일한 인덱스에서 일반문이 한번 처리된 후 진행되므로
k값이 두번 감소되는 실수가 있었다.
배열의 길이가 짧아서 (테스트케이스 3번) 다음 배열로 넘어가는 로직이 연속으로 발생한다면, k값을 처리하지 못하는 문제가 있었다.
k값의 전위 연산자, 후위 연산자 처리를 하지 못해서 계속된 오류에 빠지게 되었다.
Solution 1)
이러한 문제는 특정한 패턴을 찾아야했다.
테스트케이스 별로 손코딩해보고 특정 규칙을 찾아 알고리즘을 풀어내고자 하였다.
(2 * (k - 1) % numbers.length) 라는 식이 이 특정 규칙을 나타내는 식이었다.
<전체코드>
public class throw_balls {
public static int solution(int[] numbers, int k) {
int answer = 0;
answer = numbers[(2 * (k - 1) % numbers.length)];
return answer;
}
public static void main(String[] args) {
int[] numbers = {1,2,3,4};
int k = 2;
System.out.println(solution(numbers, k));
}
}
특정 패턴을 찾기 전까지는 하드코딩 방식으로 테스트케이스 별로 조건문을 맞추고자 노력했으나,
손코딩해보면서 특정 규칙을 찾아 식을 만들어서 풀었지만
💡다른 풀이 방식이 있는지 더 알아봐야겠다고 느꼈다.
문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120843
'Algorithms > 프로그래머스' 카테고리의 다른 글
[프로그래머스] '주사위의 개수' - Java (0) | 2023.04.30 |
---|---|
[프로그래머스] '배열 회전시키기' - Java (0) | 2023.04.30 |
[프로그래머스] '구슬을 나누는 경우의 수' - Java (0) | 2023.04.29 |
[프로그래머스] '2차원으로 만들기' - Java (0) | 2023.04.28 |
[프로그래머스] '모스부호 (1)' - Java (0) | 2023.04.28 |