문제1
정수 배열 date1과 date2가 주어집니다.
두 배열은 각각 날짜를 나타내며 [year, month, day] 꼴로 주어집니다.
각 배열에서 year는 연도를, month는 월을, day는 날짜를 나타냅니다.
만약 date1이 date2보다 앞서는 날짜라면 1을, 아니면 0을 return 하는 solution 함수를 완성해 주세요.
문제2
아무 원소도 들어있지 않은 빈 배열 X가 있습니다.
길이가 같은 정수 배열 arr과 boolean 배열 flag가 매개변수로 주어질 때,
flag를 차례대로 순회하며 flag[i]가 true라면 X의 뒤에 arr[i]를 arr[i] × 2 번 추가하고,
flag[i]가 false라면 X에서 마지막 arr[i]개의 원소를 제거한 뒤 X를 return 하는 solution 함수를 작성해 주세요.
문제3
정수 배열 arr이 매개변수로 주어집니다.
arr의 길이가 2의 정수 거듭제곱이 되도록 arr 뒤에 정수 0을 추가하려고 합니다.
arr에 최소한의 개수로 0을 추가한 배열을 return 하는 solution 함수를 작성해 주세요.
문제4
문자열 myString과 pat이 주어집니다.
myString에서 pat이 등장하는 횟수를 return 하는 solution 함수를 완성해 주세요.
문제5
문자열 myString이 주어집니다.
myString을 문자 "x"를 기준으로 나눴을 때
나눠진 문자열 각각의 길이를 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
🕹️ 문제를 풀기위해 알면 좋을 것
- 원본 배열을 건드리는가 / 안건드리는가
slice // 얕은 복사본 리턴
splice // 직접 원본 배열을 건드림
- Array.flatMap( )
- String.indexOF( )
Array.findIndexOf() 와 비슷해보인다
호출한 문자열에서 주어진 값과 일치하는 항목이 있는지 확인하여 문자열에서 첫 번째로 일치하는 항목의 인덱스를 반환한다.
일치하는 값이 없다면 -1을 반환한다
내 답안지
문제1
첫번째 시도
function solution(date1, date2) {
for(let i=0; i<3; i++){
if(date1[i] < date2[i]){
return 1
}
}
if(date1[2] >= date2[2]){
return 0
}
}
이렇게 제출했더니 거진 절반 좀안되게 테스트케이스에서 실패했다ㅋㅋㅋ
조건을 잘 걸러내지 못한 것...
다시 천천히 생각해봤다.
일단 for문에서 date1의 각 요소가 date2의 각 요소보다 작으면 바로 return 1을 해주고 나서
각 요소가 같을 경우와 클경우를 각각 따로 걸러주기로 했다.
for문 안에서 date1의 각 요소가 date2의 각 요소보다 작을 경우를 먼저 걸러주고,
명확하게 date1[i] > date2[i] 일 경우에 바로 return 0을 해준다.
이 루프 거름망에 안걸리는 경우는 하나.... 년,월이 같고 마지막 요소인 날짜까지 같을 경우이다.
function solution(date1, date2) {
for(let i=0; i<3; i++){
if(date1[i] < date2[i]){
return 1
}else if(date1[i] > date2[i]){
return 0
}
}
if(date1[2] === date2[2]){
return 0
}
}
그래서 마지막에 같을 경우를 추가해서 걸러 주는것으로 해결!
문제2
첫번째 시도
function solution(arr, flag) {
const current = [...arr]
// 플래그 false
const flagF = (arr, n)=> {
return arr.slice(0, arr.length-n)
}
const flagT = (arr, n) =>{
let count = 0
const limit = n
const tempArr= [...arr]
while(count <= n*2){
tempArr.push(n)
count += 1
}
return tempArr
}
current.forEach((item, index)=>{
if(flag[index]){
flagT(current, arr[index])
}else{
flagF(current, arr[index])
}
})
return current
}
내 첫번째 답에서는 대상 배열을 수정하지 않는다ㅠ... slice는 얕은 복사본을 생성해주기 때문...
그래서 수정한걸 다시 할당해주던가/ 직접 배열을 수정하는 메서드로 써야 한다
수정한 답안
function solution(arr, flag) {
const answer = []
// 플래그 false
const flagF = (arr, n)=> {
return arr.splice(-n, n)
}
const flagT = (arr, n) =>{
for(let i=0; i <n*2; i++){
arr.push(n)
}
}
for(let i = 0 ;i< arr.length; i++){
if(flag[i]){
flagT(answer, arr[i])
}else{
flagF(answer, arr[i])
}
}
return answer
}
slice -> splice 로 변경해 잘라내는 인덱스를 -n, n 으로 해서 뒤에서부터 n개 잘라내도록 했다.
++ (arr.length-n, n) 요렇게 써줘도 똑같이 동작한다
true일 경우 반복하는 횟수도 n*2회로 수정, 직접 push 하도록 했다.
문제3
function solution(arr) {
const answer = [...arr]
let len = arr.length
let isSqrt = Math.sqrt(len)
let count = 0
if(isSqrt %2 !== 0){
count = isSqrt%2
}
if(count !==0){
for(let i=0; i<= count; i++){
answer.push(0)
}
}
return answer
}
음... 일단 길이가 2의 제곱근인지 확인한 다음, 모자란 값만큼 배열에 push 해주려는 의도로 이렇게 짰다...
그런데 배열의 길이가 2의 제곱근인지 판별하는 부분이 잘못 되었다고 한다ㅠ...
Math.sqrt(len) %2 의 값만큼 반복해서 0을 push해주면 될거라고 생각했었는데
문제4
첫번째 시도
function solution(myString, pat) {
const temp = myString.split(pat)
let count = 0
for(let i=0; i<temp.length; i++){
if(temp[i].length <= 0){
count +=1
}
}
return count
}
내 생각엔 일단 pat을 기준으로 split을 한다음 빈문자열의 갯수를 세면 될것이라고 생각했다
그런데 테스트 케이스를 보니
문자열이기 때문에
"banana" | "ana" 라면 "ana"가 두 번 등장하는 것....
그래서 두번째 방법으로는 일치하는 첫 번째 인덱스를 찾고, 그 인덱스+1 부터 문자열을 잘라서 다시 일치하는지 확인하는 걸 생각했다. 그런데 findIndexOf() 는 배열에 사용할 수 있는 메서드이고.... 문자열에 사용할 수 있는 비슷한 메서드가 있나 찾아봤더니 indexOf()라는게 있었다.
두번째 시도
function solution(myString, pat) {
let answer = 0;
let current = myString;
let index = current.indexOf(pat)
while(index !== -1){
answer += 1
current = current.slice(index+1)
index = current.indexOf(pat)
}
return answer
}
그래서 일단 pat과 일치하는 문자열의 인덱스를 찾고 그 인덱스+1 한 부분부터 잘라내서 새 문자열로 둔 다음 다시 일치하는게 있는지 다시 확인한다.
indexOf( ) 가 일치하는게 없으면 -1을 반환하기 때문에 -1이 아닌동안 반복하도록 while을 썼다.
+)다른 사람 풀이
정규식 활용
- 아... 정규식 search() 를 생각해보긴했는데 정규식을 어떻게 짜야할지 몰라서 못썼다ㅠㅠ 참고하자
function solution(myString, pat) {
const reg = new RegExp(`(?=${pat})`, "g")
return myString.match(reg)?.length || 0;
}
문제5
function solution(myString) {
var answer = [];
const temp = myString.split('x')
answer = temp.flatMap((e)=> e.length)
return answer;
}
일단 'x'를 기준으로 split 을 사용해서 잘라낸다
그럼 대략 ["a", "", "ss"] 이런식으로 될 것이다.
그 다음에 flatMap을 돌려서 각 요소의 길이가 어떤지 평가를 돌려서 새!!!! 배열을 반환한다.