728x90

 

 

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

 

풀이 - 나의 생각

이 문제를 풀기 위한 포인트!!!!

1. 중복 제거

2. 한 바퀴 돌리기

 

1. 중복 제거

Set 쓰면 해결!!

 

2. 한 바퀴 돌리기

 

이중 for문 쓰면서 해결했는데

 

결국에는 주어진 배열을 넘어가면

 

처음으로 넘어가는 게 중요

 

처음에는

 

index = i+j >= arr.length ? (i+j)-arr.length : i+j

 

이런 식으로 했는데

 

index = (i+j)%arr.length

 

이렇게 하면 더 간단하게 해결 할 수 있었다.

 

테스트 결과 속도도 더 빨랐다. ( 조건 검사를 할 필요가 없으니까)

 

이외.....

 

처음에는 더해지는 값들을 저장하기 위해

 

반복문 안에서

 

int형 변수 하나를 선언해서

 

값을 더해가면서 Set에 저장했는데

 

그것 보다는

 

반복문 밖에서 int형 배열을 선언해서

 

값을 더해가면서 저장하는게

 

속도가 더 빨랐다.

 

아무래도 반복문이 돌아갈때마다

 

변수를 선언 및 초기화 시키는데

 

메모리가 할당되는 시간이 발생하기 때문으로 파악된다.

 

 

코드

 

import java.util.*;

class Solution {
    public int solution(int[] elements) {
        Set<Integer> nums = new HashSet<>();
        int len = elements.length; // .length() 가 계속 사용되기 때문에 차라리 변수를 하나 선언
        int[] sums = new int[len]; // 연속으로 더할 값을 저장하기 위한 배열
        
        for(int i = 0; i < len; i++){
            for(int j = 0; j < len; j++){
                sums[j] += elements[(i+j)%len]; // 주어진 배열의 범위를 넘어가지 않으면서 돌게
                nums.add(sums[j]);
            }
        }
        return nums.size(); // Set은 중복 제거가 알아서 되기 때문에, 저장된 Set의 길이가 나올 수 있는 모든 합의 경우의 수다
    }
}

 

 

 

 

 

 

 

다음에 또 봐요

 

728x90

 

 

문제

 

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

 

제한사항

제한사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

 

 

입출력 예

 

입출력 예

 

array n result
[3, 10, 28] 20 28
[10, 11, 12] 13 12

 

입출력 예 설명

입출력 예 #1

  • 3, 10, 28 중 20과 가장 가까운 수는 28입니다.

입출력 예 #2

  • 10, 11, 12 중 13과 가장 가까운 수는 12입니다.

 

코드

 

class Solution {
    public int solution(int[] array, int n) {
        
        int answer = 1000;
        int sub = 100; //n과의 거리가 현재 가장 가까운 값
        int temp = 0;
        
        for(int i = 0; i < array.length; i++)
        {
            temp = array[i] - n; //n과의 거리
            if(temp < 0) //음수이면 양수로 바꾸기 위해
            {
                temp*=-1; // Math.abs(arr[i] - i); 로 대체 가능합니다.
            }
            
        	if(temp < sub) // 현재 n과의 거리가 기존의 거리보다 가까우면
        	{
        		sub = temp;
        		answer = array[i]; // n과 가까운 값 저장
        	}
            else if(temp == sub && answer > array[i]) // n과의 거리가 동일할 경우 더 작은 값을 저장
            {
                sub = temp;
                answer = array[i];
            }
        }
        return answer;
    }
}

 

 

풀이

 

정렬 쓰기 싫었고, Math 쓰기 싫어서 이렇게 했습니다.

 

풀이 방법은 주석을 보시면 아시겠지만

주어진 정수(n)과 가장 가까운 수를 찾아야합니다.

 

그렇기때문에

배열(array)에 저장된 값을 주어진 정수(n)과 뺀 값이

sub(현재 가장 가까운 거리)보다 작으면

그 값을 sub으로 저장 및 비교하면서 

가장 가까이 있는 수를 찾아줍니다.

 

이때 주의점 2가지

1. n보다 배열에 작으면(arr[i]  <  n)

뺄때 음수가 나오니까 양수로 바꿔줍시다.

(-2 보다 1이 더 가깝지만, -2 < 1 이기 때문에)

 

2. 가장 가까운 수가 여러개 일때, 더 작은 수를 출력해야 합니다.

 

해결 방안

1. 음수라면 -1을 곱해서 양수로 만들어줍니다.

 

	temp = array[i] - n; //n과의 거리
	if(temp < 0) //음수이면 양수로 바꾸기 위해
	{
		temp*=-1; // Math.abs(arr[i] - i); 로 대체 가능합니다.
	}

 

2. sub이 동일할때 더 작은 수를 저장합니다.

 

            if(temp == sub && answer > array[i]) // n과의 거리가 동일할 경우 더 작은 값을 저장
            {
                sub = temp;
                answer = array[i];
            }

 

다음에 또 봐요

 

728x90

 

문제

문제 설명

머쓱이는 친구들과 동그랗게 서서 공 던지기 게임을 하고 있습니다. 공은 1번부터 던지며 오른쪽으로 한 명을 건너뛰고 그다음 사람에게만 던질 수 있습니다. 친구들의 번호가 들어있는 정수 배열 numbers와 정수 K가 주어질 때, k번째로 공을 던지는 사람의 번호는 무엇인지 return 하도록 solution 함수를 완성해보세요.

 

제한사항

제한사항

  • 2 < numbers의 길이 < 100
  • 0 < k < 1,000
  • numbers의 첫 번째와 마지막 번호는 실제로 바로 옆에 있습니다.
  • numbers는 1부터 시작하며 번호는 순서대로 올라갑니다.

 

입출력 예

입출력 예

numbers K result
[1, 2, 3, 4] 2 3
[1, 2, 3, 4, 5, 6] 5 3
[1, 2, 3] 3 2

입출력 예 설명

입출력 예 #1

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 1번에게 공을 던집니다.

입출력 예 #2

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 5번에게 공을 던집니다.
  • 5번은 세 번째로 1번에게 공을 던집니다.
  • 1번은 네 번째로 3번에게 공을 던집니다.
  • 3번은 다섯 번째로 5번에게 공을 던집니다.

입출력 예 #3

  • 1번은 첫 번째로 3번에게 공을 던집니다.
  • 3번은 두 번째로 2번에게 공을 던집니다.
  • 2번은 세 번째로 1번에게 공을 던집니다.

 

코드

class Solution {
    public int solution(int[] numbers, int k) {
        return numbers[((k-1)*2)%numbers.length];
    }
}

 

풀이

 

 

예 #2

1. 1번은 첫 번째로 3번에게 공을 던집니다.

2. 3번은 두 번째로 5번에게 공을 던집니다.

3. 5번은 세 번째로 1번에게 공을 던집니다.

4. 1번은 네 번째로 3번에게 공을 던집니다.

 5. 3번은 다섯 번째로 5번에게 공을 던집니다.

 

 

 

자! 그러면 차근차근 풀어봅시다.

1. 공은 한명을 넘겨서 던져집니다.

그러면 던진 길이는 k의 2배 이겠죠?

 

2. 근데 우리는 던진 친구를 찾아야 합니다.

던진 친구의 위치 = ( k * 2) - 2

                              = ( k - 1) * 2  

( k - 1 ) * 2에 위치하는 친구를 찾으면 됩니다.

 

3. 근데 ( k - 1 ) * 2가 배열(numbers)의 길이를 넘을 수도 있기때문에

( k + 1 ) * 2 을 배열(numbers)의 길이(numbers.length)로 나눈 나머지 값을 구합니다.

					((k-1)*2)%number.length

 

이렇게 하면 k 번째 공을 던진 친구를 찾을 수 있게 됩니다!!!

 

다음에 또 봐요

 

+ Recent posts