이노캠 5주차(목)-key값이 정해지지 않은 foreach문

rimhye·2023년 6월 23일
1

이노캠

목록 보기
20/39

📌알고리즘 문제풀이

[문제설명]

  • 우리나라 고유의 윷놀이는 네 개의 윷짝을 던져서 배(0)와 등(1)이 나오는 숫자를 세어 도, 개, 걸, 윷, 모를 결정합니다.
  • 네 개 윷짝을 던져서 나온 각 윷짝의 배 혹은 등 정보가 주어질 때 도(배 1개, 등 3개), 개(배 2개, 등 2개), 걸(배 3개, 등 1개), 윷(배 4개), 모(등 4개) 중 어떤 것인지를 결정하는 프로그램을 작성하세요.

    [입출력 예시]
  • [0,1,0,0] : 걸

📖내가 푼 방식

원래 arr1이라는 윷을 던져 나온 값이 주어지는데 나는 랜덤으로 값이 나오는 것부터 풀어버렸다.

function solution(arr1){
    let answer= "";
    
    let makeNum=[];
for(i=0; i<4; i++) {
const randomNumber = Math.floor(Math.random() * 2)
    makeNum.push(randomNumber)    
}  //0또는 1이 랜덤으로 push해 총 4개가 들어가는 makeNum을 만들었다. 야구게임 응용임!

console.log(makeNum) 

const result = [];
makeNum.forEach((x) => { 
  result[x] = (result[x] || 0)+1; 
}); //이 makeNum 속 중복된 개수글 적용하는 식이다. 블로그에서 본 코드인데 탐이 나서 가져왔다. 이렇게 하면 0의 개수는 result[0]에, 1의 개수는 result1에 들어가게 된다. 


console.log(result)

//0의 개수에 따라 if문을 돌렸다. 
    if(result[0]===4){
        console.log("윳")
    }else if(result[0]===3){
        console.log("걸")
    }else if(result[0]==2){
        console.log("개")
    }else if(result[0]===1){
        console.log("도")
    }else if(result[0]===0){
       console.log("모")
    }

🔨시행착오

처음에 if문을 if-else-else...로 이어서 오류가 났다. 그래서 다른 조원분께서 짠 코드를 보고 if-elseif로 고쳐서 넣었는데도 오류가 나서 한참 고민했다. 근데 else(띄어쓰기)if로 쓰지 않아서 생긴 문제였다...😢

✅else문과 else if문의 차이는?

이걸 해결하고 나서 가진 의문은 foreach문과 관련된 것이었다. 내가 쓴 foreach문은 중복값 개수를 배열로 만들어준다.

✅foreach문 돌아가는 순서

처음에 배열의 첫번째 값 'a'가 들어오면, result[x], 즉, result.a는 undefined다. 그래서 result.a가 undefined이므로 result에 a 속성을 추가하고, 0+1, 즉, 1을 세팅한다. 그후 배열의 두번째 값 'b'가 들어와도 마찬가지로 result에 b 속성을 추가하고, 1을 세팅하고 배열의 세번째 값 'a'가 들어오면, 이번에는 result.a의 값이 1로 세팅되어 있으므로, result.a의 값을 result.a + 1, 즉, 1+1, 2로 세팅된다.

참고사이트: [Javascript] 배열 중복 값 개수 구하기

여기까진 쉽게 이해됐다. 여기서 의문인 것은 이것이었다.

"어째서 0의 개수가 인덱스 0번인걸까?🤔"

처음엔 요소 값의 크기에 따라 오름차순으로 정렬했다고 생각했지만 0의 개수가 더 많아도 0의 개수는 result[0]에 기록됐다. 내가 foreach문을 돌릴때 나는 따로 key값을 정하지 않은 배열로 foreach를 돌렸다. 그래서 배열에서 임의로 key값을 x값으로 지정해 돌리고 key값의 숫자 순서대로 index순서가 정해진 것이라는 가설을 세웠다. 그리고 실험해보았다.

🔨실험해보기

const makeNum=[5,7,6,7]일때

makeNum.forEach((x) => { 
  result[x] = (result[x] || 0)+1;
  console.log('x:'+x)
  console.log('result'+result[x]) 
});
console.log(result)

의 값은

x:5
result1
x:6
result1
x:7
result1
x:7
result2
[ <5 empty items>, 1, 1, 2 ]

로 출력된다.앞에 빈 5개의 empty items는 순서대로 0,1,2,3,4를 key값으로 둔 value라고 생각하면 딱 맞는다. 내 예상이 맞았음!!

그렇다면 알파벳인 경우도 key값이 오름차순으로 될까? 마찬가지로 makeNum=[d,b,a,c]로 정해서 돌려봤다. 그러자 결과는

x:d
result1
x:b
result1
x:a
result1
x:c
result1
[ d: 1, b: 1, a: 1, c: 1 ]

알파벳은 적용되지 않는다. 하기야 숫자랑 알파벳 둘다 생략되면 큰 혼동이 올거다. JS가 Key값이 지정되지 않으면 숫자를 멋대로 생략해버린다니 새로운 정보를 알게 됐다.

✍️느낀점

코드를 짤 때는 대충 이렇게 돌아가겠지라고 생각한대로 잘 돌아가서 넘어갔지만 TIL을 쓰면서 정리하다보니 이상함을 느껴 foreach문에 대해 공부하는 시간을 가지게 됐다. 가설이 맞는지 안 맞는지 실험해보니 꽤 재밌고 내가 생각한 게 맞다는 사실이 뿌듯했다.✨✨ 사실 JS문법에 대해 더 빡시게 공부했으면 저 식을 봤을 때부터 알아챘을 수도 있지만ㅋㅋㅋㅋ... 암튼 알게 된 것에 만족한다. 모던 자바스크립트 DEEP DIVE를 샀으니 여유있을때마다 틈틈히 공부하면서 이론지식을 쌓아야겠다.

profile
개발자가 되고 싶어요

0개의 댓글