누가 이문제좀 풀어봐요~! 고수님들 헬프미 > 토크

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!

토크

개발과 관련된 어떤 얘기도 괜찮습니다.

누가 이문제좀 풀어봐요~! 고수님들 헬프미 정보

누가 이문제좀 풀어봐요~! 고수님들 헬프미

본문

아 궁금해 죽겠네요.

http://tryhelloworld.co.kr/challenge_codes/181 

 

아 왜 이렇게 어려운거야 ㅜㅜ 

내가 문제파악을 잘못하는건지 아니면 원래 어려운건지 모르겠습니다. 

이것 땀시 하루를 날려먹는데 아 하늘이 노랗다....

 

고수님들 헬프미~!

 

추신 : 누군가 문제를 푸신다면 꼭 로그인하셔서 푸세요. 저장을 따로 해두시던가요. 다 풀고 로그인하라고하면 답이 날라가서 곤란할수도 있습니다.

추천
0
비추천
0

댓글 5개

오래전에 쉽게 풀었던 문제입니다.

설명으로 하자면 A에서 작은값 B 에서 큰 값을 가져와서 곱해주고
더해줍니다.
그리고  A 배열은 shift 로 빼주고 B 배열은 pop 으로 빼줍니다.
결과적으론 두 배열의 값이 점점 비워지겠죠?


제 풀이 입니다.

function getMinSum(A,B){
  var answer = 0;
  var sequence = A.length;
  var i = 0;
  while (i < sequence) {
    answer += (Math.min.apply(null, A) * Math.max.apply(null, B));
    A.shift();
    B.pop();
    i++;
  }
  return answer;
}

//아래 코드는 테스트를 위한 출력 코드 입니다.
var tA = [1,2],
    tB = [3,4];

console.log(getMinSum(tA,tB));
감사합니다.

생각하던 방식과는 너무 다르군요.
저는 모든 케이스의 방법을 체크하고 가장 작은것을 골라라 였는데요.
풀어주신 방법은 "min*max 가 제일 작다라는것"을 전제로 하는군요.
또한 순열이 1,2 즉 커질때에만 가능하구요.

내가 문제를 너무 어렵게 생각해서 고생을 ㅜㅜㅜㅜ
감사합니다.
제가 접근한 방법은 다음과 같습니다.

1. A 라는 배열에서 제일 작은 값을 뽑고  B 라는 배열에서 제일 큰 값을 뽑습니다.
2. 둘의 곱을 합니다. (제일 작은 수와 제일 큰 수를 곱하였기에 최솟값이 성립됩니다.)
3. 배열에 해당 값이 남아있으면 최솟값을 뽑을 수 없으므로 A 에서 제일 작은 수와 B 에서 제일 큰 수를 배열에서 제외 시킵니다.
4. 그런식으로 남은 수에 대해 작은 수와 큰 수를 곱한 값을 더합니다.

물론 위의 Math.min.apply 와 Math.max.apply 를 쓰기위하여
해당 값들은 ' 셈이 가능한 수' 이다라는 전제조건이 필요합니다.
먼저 관심을 가져 주셔서 감사드립니다.
덕분에 좋은 공부가 되었습니다.

답 가르쳐 주신분께 예의없어 보이지 않게 진지하게 쓰고 살펴보고 올립니다.

저는 문제 자체가 잘못된것이 아닌가 싶기도 하거든요.


저는 주신 답을 보고 이런생각이 들었습니다.
[1,2] 배열은 되지만 [2,1]배열은 안된다.
즉 다음 숫자가 작아지면 안된다는 것입니다.

위에서 pop을 사용하셨기 때문에 자연스럽게 B의 제일 마지막 배열이 사라집니다.
(이것은 B의 마지막이 젤 큰수이다 라는 전제가 있는것이지요. 마찬가지로 A도 같은 전제를 가지고 있습니다. 그래서 shift가 가능합니다.)
하지만 B의 마지막 배열의 값이 가장크지 않다면 문제가 생깁니다.

Math의 max와 min를 사용한것은 배열은 처음과 마지막이 큰수와 작은수라는 전제가 있기 때문에 선택자로서의 의미밖에는 없는것 같습니다. 
위 조건에서는 A[0],B[B.length-1]과 같습니다.
(만약 의미가 있으려면 max값이 몇번째 배열에 있는지까지 알아내고 그것을 배열에서 빼는(또는 -1로 플래그를 주는)방식으로 해야 유효할 것이라고 생각합니다. 즉 shitf와 pop을 사용할 수 없습니다.)

또한 Math.max.apply(null,배열)은 배열에 같은 값이 있을때 문제가 있다고 들었습니다.
(문제에서 "자연수의 수열" 이라고 했기 때문에 같은 수 중복이 될 수 있습니다.)


간단하게 정리하자면 큰수 작은수를 찾는 과정이 필요없습니다.
이미 큰수는 제일끝에 작은수는 제일 앞에 있습니다.
또한 가장 작은수와 큰수를 곱하고 그 합을 더하면 그 값이 가장 작다라는 전제도 있습니다.


저는 이렇게 봤거든요.

문제설명에서는 자연수라고만 되어 있어서 숫자가 커진다는 조건은 없는것으로 판단했습니다.
1. 수열 A,B는 자연수로 이루어져 있다.
2. 같은 수가 중복으로 나올 수 있다.
3. 작은수부터 큰수로 정렬되어 있지 않다.

"효율적인 재귀호출 함수를 이용한다."
그런데 모든 경우의 수를 지나가는 트래버서를 어떻게 구현해야 하나?
그리고 각 트래버서가 끝난 시점의 정보저장은 어디다가 해야 할까?

이 점이 막막했습니다.
재귀호출을 이용하면 모든 경우수를 할 수 있을테니요....

또한 상수를 쓰면 안되는것 같기도 하구요.
답이 함수로만 가능한거 같아서요.

지금 제 결론은
1. 문제를 제대로 이해 못했다.
2. 작은수 * 큰수의 합이 가장 작다는 것을 모르고 있었다.
3. 문제가 요구하는것은 복잡한 트래버서의 구현이 아니라 가장 작은 수이다.
4. 사실 정렬이 안되어 있으면 정렬 시켜서 하면 되는데 생각을 못했다.
(왜냐하면 2번을 몰랐으니까 ㅜㅜ)

이렇게 정리하고 있습니다.

정리 하다 보다 다시 정리하다 보다 loop를 돌다 보니 글이 길어졌습니다.
다시 한번 감사합니다 라고 인사드립니다.
문제가 이상하다는 논제에 적극적으로 동의 합니다.
말씀하신 부분처럼 같은 값이거나 또 배열의 곱 이후에 sorting 이 제대로 이루어 지지 않는다면 말 그대로 버그가 맞죠.
(사실 저도 깔끔하게 풀었다고 할 수 없는 부분이 말씀하신 부분에 대해 생각해보니 그런부분에 대해 제가 놓쳤다고 할 수 있습니다.)

또 testcase 에서의 대입 숫자도 작은 수에서 큰 수로 수열이 이루어져있다는 부분에서
말 그대로 편법으로 풀이가 가능한 부분이 존재할 것 같습니다.

저는 문제 자체를 문자 그대로만 인지하고 더 깊게 생각 안하고 풀어서 쉽게 생각했었던것 같습니다.
알고리즘이라고 하기엔 조금 부끄러워지긴 하네요 하하하
전체 4

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT