[문제설명]
- 우리나라 고유의 윷놀이는 네 개의 윷짝을 던져서 배(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문의 차이는?
- else문은 if문의 조건이 거짓일 경우이다.
- else if문은 새로운 조건을 추가할 수 있다.
- else if는 여러 조건을 중첩할 수 있다.
- else문의 조건에 해당하지 않을 경우 마지막에 조건을 지정할 수 있다.
참고사이트:[Javascript] 조건문 (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의 개수는 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를 샀으니 여유있을때마다 틈틈히 공부하면서 이론지식을 쌓아야겠다.