Code Signal -Arcade
코드시그널
아케이드 문제 관련 풀이들을 구글링하면서 찾아가는 일지를 하나씩하나씩 기록하고자 합니당.
주로 자바 위주로 풀이를 올릴예정이고, 추가로 공부하고 있는 파이썬이나 코틀린, GO, 자바스크립트 더 나아가 스위프트까지...
되는대로 가능한대로 구글링하고 정답맞추면 바로 패스!!
이런식으로 좋은 코드이든 말든 짜집기한 결과물들을 개인적 소장을 위해 기록합니다. ^^
참고 사이트들은 아래에 링크로 남겨둘터이니 자세하고 더욱 깊은 내용들은 링크로 들어가보세요!
Absolute Values Sum Minimization
절대값들 합의 최소화
무슨말인가 싶다.. 제목만 보면.
설명을 보면 좀 더 이해가 되기시작하는데 극혐
문제의 설명을 보면, 주어진 숫자 배열들이 입력된다.
그리고 Math.abs를 통해 절대값들을 나타내는데
각 요소에 배열의 요소를 각 각 빼준다.
그리고 그 뺀값들을 다 더해준다.
이렇게 나온 각 요소별 절대값 빼기 합? 을 한 결과 값을 비교했을때 가장 작은 경우가
리턴값이다.
도저히 이것을 한글로 무슨 문제라고 해야할지 모르지만 일단 해석을 하면 그렇다.
예시를 보면 좀더 이해가 될 것이다.
그렇다면 답안을 보자.
int absoluteValuesSumMinimization(int[] a) {
int compare = Integer.MAX_VALUE, test = 0, result =0;
for(int i =0; i<a.length; i++){
test =0;
for(int j =0; j<a.length; j++){
test += Math.abs(a[j]-a[i]);
}
if(test < compare){
result = a[i];
compare = test;
}
}
return result;
}
반복문을 통해서 각 요소값들을 빼주고, 거기에 절대값을 씌운뒤 다 합해줘야 하는 코드가 필요하다.
여기서 의문이 드는 부분이 compare = Integer.MAX_VALUE로 선언한 것이다.
그 이유는 테스트 도중 이런 테스크가 있었기 때문이다.
a: [-1000000, -10000, -10000, -1000, -100, -10, -1, 0, 1, 10, 100, 1000, 10000, 100000, 1000000]
아주 극혐이다. 엿 먹이려는 것 같았다. 이 테스트를 보면 마이너스 값이 분포한다.
심지어 단위도 크다. 심지어 테스트 9번은 아래와 같다.
a: [-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150]
이게 뭔가 싶겠지만, 암튼 이런 그지같은 테스트도 다 통과 시키려다 보니 integer의 최대값이 필요해졌다. (아무튼 그렇다.)
반복문을 보면
for(int i =0; i<a.length; i++){
test =0;
for(int j =0; j<a.length; j++){
test += Math.abs(a[j]-a[i]);
}
if(test < compare){
result = a[i];
compare = test;
}
}
이렇게 되어있다.
두개의 반복문을 활용하여
test += Math.abs(a[j] - a[i] ); 부분을 진행해준다.
이렇게 하면 각 요소별로 계산한 값의 합을 test에 넣어주게 되는데,
여기서 조건식을 걸어서
제일 최소값을 걸러서 그 값을 result 에 넣어주면 된다.
if조건문을 보면, 일단 integer.max_value가 등장하여 무조건 아래로 까라버려서
compare값을 만들어진 test값으로 들어가게 해준다.
이렇게 되면, 이제 test값중에 가장 큰 값이 compare가 되고 나머지 test값들이 비교 되기 시작한다.
전체 반복문이 끝이나면 결과적으로 제일 최소 값을 만들어낸 요소의 값을 result 에 넣어주어
리턴 시킨다.
끝.
이 문제에서 핵심은 비교대상의 쉿더뻑 인 것 말 고는 그리 어렵진 않았으나 그 문턱에 닥치면 진짜 답이 없고 힘빠지던 기억이 난다. 휴...
이제 엘리트 분들의 답안을 감상하자...
JAVA
int absoluteValuesSumMinimization(int[] A) {
return A[(A.length-1)/2];
}
Python3
def absoluteValuesSumMinimization(A):
return A[(len(A)-1)//2]
JS
function absoluteValuesSumMinimization(A) {
return A[Math.ceil(A.length/2)-1];
}
전체적으로 한줄... (실화?)
정말 간단한건지 다들 계산을 해보고 규칙을 발견한것인지 의문.
뭔가 이제부턴 앨리트들의 답안들이 문제에 대한 코드 표현이라기보다, 그냥 존나 간단한 코드 한줄을 추구하는 듯한 느낌이 든다. 남들은 이해 못하는 코드를 //보여주는 듯한..
설명이라도 붙여주지... 배열의 길이에서 -1 하고 /2 하는게 어떻게 절대값빼기 합의 최소값에 해당하는 요소를 리턴해주는 지 ... 그냥 그 규칙을 찾은 것인지 뭔지 절대 이해가 안가기 시작했다.
요즘은 이런 답안을 보면 그냥 넘어가는 경우가 많다. 나에겐 도움이 안되는 것 같아서 말이다.
공감 버튼 눌러주시면 더욱 많은 포스팅을 올리는데 힘이 됩니다!
부탁드려요 돈드는거 아니잖아요~
'Algorithm > Java' 카테고리의 다른 글
#33_Code Signal Arcade >> Strings Rearrangement (0) | 2020.01.14 |
---|---|
#31_Code Signal Arcade >> Deposit Profit (0) | 2019.12.06 |
#30_Code Signal Arcade >> Circle Of Numbers (0) | 2019.12.05 |