-
[Replit Javascript] 어려웠던 문제 총정리프론트엔드 개발자가 될거야./js 2022. 6. 26. 22:18
10. 논리연산자 - rockPaperScissors 함수
index.js에 있는 가위 바위 보 게임 함수를 아래 조건에 맞게 구현해주세요.
- rockPaperScissors 함수를 구현해서 가위 바위 보 게임을 구현해주세요.
- 가능하면 || 와 && 연산자 둘다 사용해주세요.
- player1과 player2 중 이긴 사람이 누군지 리턴해주세요.
- 예를 들어, player1이 이겼으면 "player1" 이 리턴 되고 그 반대의 경우라면 "player2"가 리턴이 되어야 합니다.
- 만일 비기는 경우에는 무조건 "player1"이 리턴 되어야 합니다.
- player1 과 player2 의 값은 다음 셋 중 하나 입니다.
- "가위"
- "바위"
- "보"
- 예를 들어, player1은 "가위" 이고 player2는 "보" 이면 "player1" 이 리턴 되어야 합니다.
💖 문제풀기 💖
이전에 포스팅해놔서 주소 올리기👀
https://jeongeuni.tistory.com/26
16. for문 - findSmallestElement 함수
findSmallestElement 함수를 구현해 주세요.
- findSmallestElement 의 arr 인자는 숫자 값으로만 이루어진 배열입니다.
- arr 의 값들 중 가장 작은 값을 리턴 해주세요.
- 만일 arr 가 비어있으면 0을 리턴 해주세요.
- 예를 들어, 다음과 같은 배열이 인자(input)으로 들어왔다면 1이 리턴 되어야 합니다.
[20, 200, 23, 1, 3, 9]
💖 문제풀기 💖
function findSmallestElement(arr) { if (arr.length === 0) { return 0 } else { let min = arr[0]; for (let i = 1; i < arr.length; i++) { if (min > arr[i]) { min = arr[i]; return min; } } } }
arr 의 값들 중 가장 작은 값을 어떻게 구할까? 하다가
배열의 요소들을 서로 하나하나 다 비교하는 코드를 짜보려는데
감이 도무지 잡히지 않았다. 끝이 없기 때문이다..
그래서 새로운 방법을 찾았다.
최솟값을 미리 정해두고
정해둔 최솟값보다 작으면 최솟값을 재할당해주는 방법이다.
let min = arr[0];
이렇게!
만약 arr = [20, 200, 23, 1, 3, 9] 라면
min = arr[0] = 20
min은 지금 20이다.
i = 3이 되었을 때,
min = 20 > arr[3] = 1 이니
min보다 작은 최솟값이 등장했다.
arr[3]으로 최솟값을 재할당 해준다.
이렇게 구현되어있는 코드이다.
17. 배열 조작하기 - divideArrayHalf 함수
divideArrayInHalf 함수를 다음과 같이 구현해주세요.
- divideArrayInHalf 함수는 array를 인자로 받습니다. 이 array는 숫자 값으로 만 구성되어 있으며 총 5개의 요소(element)들로 구성되어 있습니다.
- divideArrayInHalf 함수는 인자로 들어온 array 로 부터 새롭게 구성된 배열 result 을 리턴합니다.
- array 요소들 중 10과 같거나 작은 값의 요소들은 result의 맨 앞으로, 10보다 큰 값의 요소들은 result의 맨 뒤로 재구성된 배열을 리턴 해주세요.
- 재구성이 되는 순서는 array의 맨 뒤 요소부터 맨 앞 요소까지 입니다. 즉, 배열의 뒷 요소 부터 재구성을 진행해주세요.
- 예를 들어, 인자로 들어오는 array가 다음과 같을 때,
[1, 20, 10, 5, 100]
result 배열이 만들어 지는 순서는 다음과 같습니다.
- [100]
- [5, 100]
- [10, 5, 100]
- [10, 5, 100, 20]
- [1, 10, 5, 100, 20]
따라서 아래와 같은 result가 리턴 되어야 합니다.
[1, 10, 5, 100, 20]
💖 문제풀기 💖
이것도 이전에 포스팅했었다. ㅎ ㅡㅎ
https://jeongeuni.tistory.com/27
19. String - sliceCityFromAddress 함수
sliceCityFromAddress 함수를 구현해 주세요.
- sliceCityFromAddress 함수는 address 를 인자로 받습니다.
- address 는 주소를 나타내는 string 입니다.
- 주어진 주소가 어느 도시 인지를 찾아 해당 주소에서 도시 부분만 삭제한 새로운 주소를 리턴해 주세요.
- 도시는 무조건 "시" 로 끝납니다. 예를 들어, "서울시".
- "도" 와 "시" 는 주소에 한번 밖에 포함되어 있지 않습니다.
- 예를 들어, 다음과 같은 주소가 주어졌다면
"경기도 성남시 분당구 중앙공원로 53"
다음과 같은 값이 리턴되어야 합니다:
"경기도 분당구 중앙공원로 53"
21. 날짜와 시간 - getWesternAge 함수
미국을 비롯해 전세계 대부분의 나라들이 생일을 기준으로 나이를 계산 합니다. 쉽게 말해 미국은 태어나자마자 0살이고 생일을 지나야 비로소 한 살이 됩니다. 반면에 한국은 태어나자마자 1살이고 연도가 바뀔 때마다 한 살씩 먹습니다. 예를 들어 미국에서는 1995년 9월 12일에 태어났으면 1995년 9월 12일에는 0살이고 1996년 9월 12일이 되야 1살이 됩니다. 그에 비해 한국에서는 1995년 9월 12일에 태어나자마자 1살이고 1996년 1월 1일에 2살이 됩니다. 1살 차이도 크게 생각하는 우리나라 고유의 문화에 비롯한 계산법이 아닌가 추측해 봅니다. 미국이나 다른 나라가 사용하는 나이 계산법은 우리나라에서는 만 나이 라고 하죠.
앞서 말한 만으로 계산한 나이를 구하는 함수인 getWesternAge 함수를 구현해 봅시다.
- 이 함수는 birthday 라는 인자를 받습니다.
- 이 birthday 는 Date 객체 입니다. birthday 라는 인자를 넣었을 때, 현재를 기준으로 만으로 계산한 나이를 리턴 해주세요.
- birthday 는 string이 아닌 Date 객체라는 걸 명심하세요 :)
- 예를 들어, 오늘이 2020년 7월 21일이고, birthday 값이 다음과 같다면
1990-03-21T00:45:06.562Z
리턴 값은 30 이 되어야 합니다.
💖 문제풀기 💖
// 만으로 계산한 나이를 구하는 함수 function getWesternAge(birthday) { let birth = new Date(birthday); // birthday 확실히 객체화 시키기 -> 1990-03-21T00:45:06.562Z (typeOf object) let birthYear = birth.getFullYear(); // 1990 let today = new Date(); // 오늘날짜-> 2022-06-22T23:26:34.674Z let todayYear = today.getFullYear(); // 2022 let age = todayYear - birthYear ; // 나이 birth.setFullYear(todayYear); // 생년월일 객체의 연도를 오늘 날짜 객체의 연도로 변경 -> 20220321 = 1647823506562 // 1655940748661(20220622) 와 1647823506562(20220321) 비교! if( today.getTime() > birth ) { age; // 생일이 지났으면 만나이 아니고 } else { age--; // 생일이 안지났으면 만나이 } return age; }
여기서 포인트는 setFullYear 메서드를 이해하고있냐이다.
setFullYear는 월과일은 냅두고 년도만 원하는 년도로 바꿔준다.
birth.setFullYear(todayYear);
예를들어 birth가 1990-03-21T00:45:06.562Z였다면
그래서 1990이던 birth의 년도를
todayYear년도인 2022년으로 바꿀 수 있었다.
즉 birth는 이제 20220321가 된 것이다.
getTime()메서드를 이용하면
어느것이 더 과거인지 알 수 있으니
이제 비교할 수 있게 되었다.🙂
23. Object (객체)
이제까지 하셨던 Assignment 와는 조금 다른 유형입니다. 그 동안에는 특정값을 구해서 리턴 했다면, 이번에는 인자로 받은 데이터를 조합해서, 구조를 바꿔서 리턴합니다.
getData 함수를 구현해주세요!
- getData 함수는 세 개의 배열을 인자로 받습니다.
- salesArr : 날짜별 판매량
- ex) [["20190401", 34], ["20190402", 23], ["20190403", 29]]
- reviewArr : 날짜별 리뷰수
- ex) [["20190328", 3], ["20190401", 0], ["20190403", 1]]
- likeArr : 날짜별 좋아요수
- ex) [["20190328", 98], ["20190401", 102], ["20190403", 125]]
- salesArr : 날짜별 판매량
- 다음 요구사항을 충족하는 객체를 만들어서 return 해주세요.
- 리턴되는 객체는 아래와 같이 3개의 property를 가집니다.
- sumAmount : 총 판매량
- sumReview : 총 리뷰개수
- sumLike : 총 좋아요수
💖 문제풀기 💖
function getData(salesArr, reviewArr, likeArr) { let sumAmount = 0; let sumReview = 0; let sumLike = 0; for(let i = 0; i < salesArr.length; i++) { sumAmount = sumAmount + salesArr[i][1] } for(let i = 0; i < reviewArr.length; i++) { sumReview = sumReview + reviewArr[i][1]; } for(let i = 0; i < likeArr.length; i++) { sumLike = sumLike + likeArr[i][1]; } let objData = { sumAmount: sumAmount, sumReview: sumReview, sumLike: sumLike }; return objData; }
총합 변수를 먼저 선언해주고 재할당해주는 것이 포인트이다.
그리고 재할당된 변수들을 모아서
새로운 객체로 할당해주기
30. object (3)
아래 설명을 읽고 getExamResult 함수를 구현하세요.
인자 scores 는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.
- 'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F'
{ '생활속의회계': 'C', '논리적글쓰기': 'B', '독일문화의이해': 'B+', '기초수학': 'D+', '영어회화': 'C+', '인지발달심리학': 'A+', }
인자 requiredClasses 는 다음과 같이 문자열로 된 배열입니다.
['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.
- scores 객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다. 단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.
- A+ => 4.5
- A => 4
- B+ => 3.5
- B => 3
- C+ => 2.5
- C => 2
- D+ => 1.5
- D => 1
- F => 0
- requiredClasses 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.
{ '생활속의회계': 2, '논리적글쓰기': 3, '독일문화의이해': 3.5, '기초수학': 1.5, '영어회화': 2.5, '인지발달심리학': 4.5, '공학수학': 0, '컴퓨터과학개론': 0, }
💖 문제풀기 💖
공포의 30번ㅋㅋㅋㅋㅋㅋㅋㅋ 그저 웃음만...
너무 어려웠다... 이틀정도 아니 그 이상(?!?) 저 문제로 머리아팠다..
방법이 두 개 있는데
1번은 노가다이구
2번은 멘토님, 동기들의 도움을 받아 풀 수 있던 방법이다.
나의 머리로는 처음에 1번 방법밖에 떠오르지 않았었다 🙂🤯🙂👩🏻💻👩🏻💻👩🏻💻
1번 방법
const getExamResult = (scores, requiredClasses) => { const scoresKeys = Object.keys(scores) //객체의 키만 뽑아 배열 만듬 // scoresKeys = [ ‘생활속의회계‘, ‘논리적글쓰기‘, ‘독일문화의이해‘, ‘기초수학‘, ‘영어회화‘, ‘인지발달심리학’ ] for (let i in scoresKeys) { const scoreskey = scoresKeys[i] const scoresValues = scores[scoresKeys[i]] if (scoresValues === "A+") { scores[scoreskey] = 4.5 }else if (scoresValues === "A") { scores[scoreskey] = 4 }else if (scoresValues === "B") { scores[scoreskey] = 3.5 }else if (scoresValues === "B+" { scores[scoreskey] = 3 }else if (scoresValues === "C+") { scores[scoreskey] = 2.5 }else if (scoresValues === "C") { scores[scoreskey] = 2 }else if (scoresValues === "D+") { scores[scoreskey] = 1.5 }else if (scoresValues === "D") { scores[scoreskey] = 1 }else if (scoresValues === "F") { scores[scoreskey] = 0 } } for (let i = 0; i < requiredClasses.length; i++) { if (!scoresKeys.includes(requiredClasses[i])) { scores[requiredClasses[i]] = 0 } } return scores }
2번 방법
onst getExamResult = (scores, requiredClasses) => { for(let i = 0; i < requiredClasses.length; i++) { if(!scores[requiredClasses[i]]){ scores[requiredClasses[i]] = 'F' } } // let scores = { // '생활속의회계': 'C', // '논리적글쓰기': 'B', // '독일문화의이해': 'B+', // '기초수학': 'D+', // '영어회화': 'C+', // '인지발달심리학': 'A+', // '공학수학': 'F', // '컴퓨터과학개론': 'F' // } let newScores = { 'A+': 4.5, 'A': 4, 'B+': 3.5, 'B': 3, 'C+': 2.5, 'C' : 2, 'D+': 1.5, 'D': 1, 'F': 0 }; for(let key in scores){ for(let newKey in newScores) { if(scores[key] === newKey){ scores[key] = newScores[newKey] } } } }
'프론트엔드 개발자가 될거야. > js' 카테고리의 다른 글
위코드 2주차 중간시험 리뷰 (0) 2022.07.01 [instagram 클론코딩] input 창에 엔터치거나 "게시"누르면 댓글 추가 구현하기 (0) 2022.06.29 [TIL] Today I Learned : 배열의 반복문 - .forEach() / .map() 차이 (0) 2022.06.24 [TIL] Today I Learned : 개념공부 - string <-> number 변환 / 날짜 객체 (0) 2022.06.23 [TIL] Today I Learned : Srting - sliceCityFromAddress함수 (0) 2022.06.23