function james(arr) {
for (i = 0; i<arr.length; i++;)
if ( min > arr[i] ) {
min = arr[i];
return min;
}
}
arr 인자는 숫자 값으로만 이루어진 array 입니다.
array 의 값들 중 가장 작은 값을 리턴하려고 합니다.
array에서 인자들 중에서 제일 작은 숫자를 리턴하려고 합니다만, 안나옵니다.
var new = arr[0]; 을 선언하고
if ( new > arr[i])로 구성해야하는건가요?
return min도 어디에 위치해야할지 모르겠습니다 ㅠㅠ
아무리해도 뭐가 안됩니다;;; 뭐가 문제일까요?
math 함수는 안쓰려고 하는데, 뭘 어떻게 해야 출력이 가능할까요?
let i = arr[0];
for (let i = 0; i<arr.length; i++) {
if ( min > arr[0] ) {
min = arr[i];
}
return min;
}
일단 이렇게 수정해보았는데도 안됩니다.
1. 변수 선언에 var 또는 const가 필요하지 않나요?
2. min은 어떤 값으로 초기화되어 있나요?
일단 var로 변수를 arr[0]으로 했습니다.
min은 그냥 최소값으로 한건데 따로 설정이 필요한가요????
let new = arr[0];
for (i = 0; i<arr.length; i++;) {
if ( new > arr[0] ) {
minmum = arr[i];
return min;
}
}
정답은 나와 있지만 혼자 생각하신 코드에 문제가 많은 것 같아 이쪽에도 댓글을 남깁니다.
이쪽의 수정하신 코드는 변수를 종잡을 수가 없네요.
new는 배열의 첫 번째 요소이고
배열의 첫 번째 요소가 new보다 작으면 minmum에 현재 루프의 배열의 요소를 넣고
min을 리턴하라는 건데, 변수가 세 가지나 나올 필요가 있을까요? (단순 실수라고는 보입니다만)
min이라는 변수를 배열 내의 최소치로 가정한 다음
루프를 돌면서 다른 값이 더 작은지 검사한 다음 작으면 대입.
그리고 루프를 다 돌면 더 이상 그보다 작은 숫자가 없으니 리턴합니다.
이렇게 봤을 때 등장하는 변수는 min밖에 없습니다.
let i = arr[0];
for (let i = 0; i<arr.length; i++) {
if ( min > arr[0] ) {
min = arr[i];
}
return min;
}
일단 말씀대로 바꾸었는데, 어떻게 해야 될까요???
키를 잰다고 생각해보세요.
이 반에서 제일 큰 애를 찾는다고 하면(max)
가상의 작은 애(예를 들면 0)를 설정하고
1번부터 끝번까지 죽 비교하면서 더 큰애가 나타나면
그 애를 현재까지의 가장 큰 애로 설정하는 것이죠.
0번을 가상의 가장 작은 아이의 키로 설정하면
누가 오더라도 1번이 바로 젤 큰 애가 되고, 그 1번의 키가
일단 그 반의 가장 큰 키가 되는 것이죠. (max = 1번키 )
다시 루프를 돌아 아까 1번키였던 max값과 2번키를 비교하면,
2번이 더 큰 경우, 새로운 max = 2번키 가 되겠죠.
1번이 2번보다 큰 경우는 여전히 1번키로 만들어진 max가 유지되는 것이고요.
이런 식으로 쭉 가는 겁니다.
윗분들 말마따나 머리속으로 그려가면서 해보면 됩니다.
이게 루프끝까지 가면 자동으로 맨 마지막에 큰 애가 제일 큰애가 됩니다.
반대로 가장 작은 애를 찾는다면 (min)
1부터 가장 작은 애가 될 수 있는 값을 가상으로 값으로 시작하는 것이죠
(min = 나올 수 있는 가장 큰 숫자 예를 들면 1000000)
요점은 이것만 기억하면 됩니다.
최소값은 1번째 만나는 값이 최소값이 될 수 있게 초기값을 엄청 큰 수로 설정하고 비교를 하는 거고,
최대값은 엄청 작은 값을 첫 비교값으로 설정하고 가는 겁니다.
그리고, for문 먼저 이해하고 나머지 이해하세요. forEach나 이런 것은 기본 다음에 배우시는게 좋을 겁니다.
var min = null;
for (var i = 0; i<arr.length; i++;){
if(i === 0){ min = arr[i];}
esle if(min > arr[i]){ min = arr[i];}
}
return min;
}
var min = arr[0];
for (i = 0; i<arr.length; i++;)
if ( min > arr[i] ) {
min = arr[i];
}
return min;
}
초기값을 배열 첫번째 값으로 하고 이후 다른 배열값과 비교해서 최소값을 구하세요.
첫번째 배열값이 정해져 있고 만약 최소값이었으면 if 문안으론 안들어가고 for 문이 끝나고 그렇지 않으면 계속 최소값을 찾게 되겠죠.
그런 일련의 과정이 끝나고 남는 값이 배열의 최소값이 됩니다.
중요한건 최초의 값이 무언가인거죠.
당연히 배열안에 있는 값으로 해야 비교가 시작이 되는거죠.
에러 방지를 위해선 min 최초값을 줄때 arr 이 null 이 아닌지 체크하는 게 들어가는게 더 좋겠죠.
나우시카님의 말씀이 맞네요
function jamse(arr) {
var min = arr[0];
for (var i = 0; i<arr.length; i++) {
if ( min > arr[i] ) {
min = arr[i];
}
}
return min;
}
가 맞는 것 같더군요.
아직도 초기값을 첫번째 값으로 하는 건 이해가 안되는데, 잘 모르겠어요 ㅜ
아래 retheviper 님께서 댓글에 설명을 잘 해놓으셨네요.
비교해야 할 대상이 배열안에 있는 값들을 가지고 비교를 해야 하는데 배열외의 임의의 값을 초기값으로 하게 되면 배열내의 값의 범위를 벗어날 확률이 엄청나게 높습니다.
당연히 주어진건 함수로 되어 있는데 그러면 함수내에서는 배열의 범위를 알수가 없는데 임의의 초기값을 주게 되면 당연 원하는 결과가 안나올 확률이 엄청나게 놓아 지는거죠.
사실 초기값은 굳이 배열 첫번째값이 아니어도 상관은 없습니다.
배열 안에 있는 어떤 수라도 초기값은 될 수 있어요.
어차피 배열 전체 비교기 때문에 배열안의 값이면 어떤 위치라도 상관이 없습니다.
편의상 첫번째걸로 하는거죠.
직접 카드 몇장에 임의의 숫자들을 놓고 바닥에 늘어 놓은 다음 위의 로직처럼 비교를 해보세요.
4-5장만 놓고 해봐도 금방 이해가 가실겁니다.
바닥에 카드를 깔고 빈카드 하나를 더 장만하세요.
이 빈카드에 바닥에 깔린 카드의 아무 숫자나 적고 비교해서 더 크면 그 카드의 숫자로 바꿔 적는걸 반복해보시면 마지막에 남는 숫자가 최소값이 됩니다.
제일 처음 작성하신 코드의 문제점은 물론 return 문의 위치도 있지만 가장 큰 문제점이 min의 초기값이 정해져 있지 않다는 겁니다.
일단 먼저 알려드릴건 전 자바스크립트는 다루어 보진 않았습니다.
그래서 위의 첫번째 경우 같이 코딩을 했을때 min의 초기값이 무언지는 정확히는 모르겠습니다만...
아마도 제 경험상 저럴 경우엔 min이 0이 아닐까 생각이 되는군요.
그러면 배열속의 데이타가 1,2,3 만 있다고 한다면 벌써 0이니 최소값이 되어 버리니 당연히 원하는 값이 안나오게 되는 거죠.
최소값은 배열속의 데이타 1,2,3 중의 값을 가지고 비교을 시작하셔야 합니다.
이거 참고 하시고요. Inifity를 써서 하는게 논리적으로 처음하는 사람이 이해가 더 쉽습니다.
위 처럼 하면 쓸데없는 if문이 i==0 일대 한번 더 합니다.
null로 쓰는 법도 있긴 한데 if else 가 2개를 굳이 쓸 필요가 없는데 라인만 길어지고 보기에도 간단하지 않죠.
1. min의 값이 초기화 되어있지 않다면 배열 내의 요소와 비교할 수가 없으니 문제가 됩니다.
2. min이 만약 배열 내의 값과 무관하게 초기화되어 있다면, min을 return 했을 때 배열과 무관한 값이 될 수도 있습니다.
(배열이 1, 2, 3이고 min이 0으로 초기화되어 있다면, 항상 return되는 값은 0입니다)
그래서 배열 내의 값으로 초기화를 할 필요가 있습니다.
3. if문 내에 return이 있다는 것은, if문에 해당하지 않는다면 return이 없다는 뜻이 됩니다.
min보다 작은 배열 내의 값이 없을 때는 아무 결과도 돌아오지 않습니다.
4. for문 내에 return이 존재한다면, 배열 전체에 대해서 검사가 불가능합니다.
배열 전체를 순환해서 최소값을 찾아내는 것이 목적이므로, return은 for문 바깥으로 빼야 합니다.
바깥으로 빼야 for문이 다 끝난 뒤(순환이 끝난 뒤) 찾아낸 값을 리턴할 수 있습니다.
for (var i =0; i < arr.length; i++)의 경우 0부터 1씩 증가시켜간다는 의미이므로
arr의 크기까지, 인덱스 0부터 시작이 됩니다.
여기서 최소값을 찾기 위해서는 전 배열 내의 요소를 봐야 하므로
min의 초기값을 0번 인덱스의 값으로 대입해 놓고, 다음 인덱스의 값과 비교해서 작은지 비교해야 합니다.
수정하신 let i = arr[0]의 경우, for에서 var i를 또 다시 선언하고 있다는 점이 문제가 됩니다.