본문 바로가기

JS 코테

<Javascript-CT> 기초 DAY 25

 

문제1
	문자열 myString과 pat가 주어집니다.
    myString의 부분 문자열중 pat로 끝나는 가장 긴 부분 문자열을 찾아서 return 하는 solution 함수를 완성해 주세요.

문제2
	문자열 배열 strArr이 주어집니다.
    strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때
    가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.
    
문제3
	임의의 문자열이 주어졌을 때 문자 "a", "b", "c"를 구분자로 사용해 문자열을 나누고자 합니다.
    예를 들어 주어진 문자열이 "baconlettucetomato"라면 나눠진 문자열 목록은
    ["onlettu", "etom", "to"] 가 됩니다.
    문자열 myStr이 주어졌을 때 위 예시와 같이 "a", "b", "c"를 사용해 나눠진 문자열을 순서대로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.
    단, 두 구분자 사이에 다른 문자가 없을 경우에는 아무것도 저장하지 않으며,
    return할 배열이 빈 배열이라면 ["EMPTY"]를 return 합니다.

문제4
	팀의 막내인 철수는 아메리카노와 카페 라테만 판매하는 카페에서 팀원들의 커피를 사려고 합니다.
    아메리카노와 카페 라테의 가격은 차가운 것과 뜨거운 것 상관없이 각각 4500, 5000원입니다.
    각 팀원에게 마실 메뉴를 적어달라고 하였고,
    그 중에서 메뉴만 적은 팀원의 것은 차가운 것으로 통일하고 "아무거나"를 적은 팀원의 것은
    차가운 아메리카노로 통일하기로 하였습니다.
    각 직원이 적은 메뉴가 문자열 배열 order로 주어질 때,
    카페에서 결제하게 될 금액을 return 하는 solution 함수를 작성해주세요.
    order의 원소는 아래의 것들만 들어오고, 각각의 의미는 다음과 같습니다.
    
문제5
	0과 1로만 이루어진 정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk을 만드려고 합니다.
    i의 초기값을 0으로 설정하고 i가 arr의 길이보다 작으면 다음을 반복합니다.
    만약 stk이 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
    stk에 원소가 있고, stk의 마지막 원소가 arr[i]와 같으면 stk의 마지막 원소를 stk에서 제거하고
    i에 1을 더합니다.
    stk에 원소가 있는데 stk의 마지막 원소가 arr[i]와 다르면
    stk의 맨 마지막에 arr[i]를 추가하고 i에 1을 더합니다.
    위 작업을 마친 후 만들어진 stk을 return 하는 solution 함수를 완성해 주세요.
    단, 만약 빈 배열을 return 해야한다면 [-1]을 return 합니다.

 

 

 

 

🕹️ 문제를 풀기위해 알면 좋을 것 

- String.lastIndexOf( 검색할 값, 시작위치)

lastIndexOf()
주어진 값과 일치하는 부분을 역순으로 탐색하여 최초로 마주치는 인덱스를 반환한다.
==> 문자열에서 가장 마지막으로 '패턴'이 시작된 위치의 인덱스
시작위치가 생략되었다면, 맨 끝에서부터 검색을 시작한다.
일치하는 부분이 없으면 -1을 반환한다.

const str= "123334567"

const first = str.lastIndexOf("33") // 3
const second = str.lastIndexOf("3") // 4

const str2 = "12333453367"
const third = str2.lastIndexOf("33")

예시에서 왜 반환값이 3,4인지 이해가 안됐었는데 역순으로 탐색한다고 맨끝의 요소의 인덱스 값을 0으로 설정하는게 아니라 단지 탐색을 시작하는 인덱스 값이 마지막 인덱스 인것이었다. 탐색 시작 인덱스 값이 0이 아닌 str.length-1인 것 

str에서 33이라는 문자열은 인덱스2와3으로 이루어진 문자열이다.  따라서 "33"이 시작하는 위치는 인덱스 2 이다.

하지만 맨 마지막 인덱스에서 부터 탐색을 시작해 가장 마지막 인덱스를 반환하기 때문에 3을 반환한 것...!!!!

그러니까

12 | 33 | 34567 이렇게 구분한 다음에 이 문자열에서 "33"과 일치하는 가장 첫 번째 인덱스가 '2'  그리고 마지막 인덱스가 '3' 인 것! 마지막인덱스 부터 찾기 시작하니까.... 그래서 3을 반환한다.

 

그리고 두번째 4가 나온이유.

가장 오른쪽에 위치한 "3"은 인덱스 4이다.

즉, 이때는 1 | 2 | 3 | 3 | 3 |  4 | 5 | 6 | 7 이렇게 나눠놓고 맨 끝 인덱스부터 찾는다. 그래서 4를 반환한다

 

 

-String.slice( )

const str = "1234567";

console.log(str.slice(1,4)); // "234"
console.log(str.slice(-4));// "4567"

 

 

내 답안지

문제1

function solution(myString, pat) {
    let index = myString.lastIndexOf(pat)
    let answer = myString.slice(0, index+pat.length)
    
    return answer
}

day24 에 있던 문제 하위호환같다.

일단 pat 문자열과 일치하는게 있는지 확인한다. 'pat으로 끝나는' 이라고 했으니 여러번 나올 수 있지만 마지막 번째까지 문자열을 잘라야 한다는 말이다. 그래서 lastIndexOf( )를 사용해 일치하는 부분의 인덱스 값을 찾아준다.

그리고 이 '패턴'이 시작된 인덱스를 반환하기때문에 인덱스+pat의 길이를 더해줘야 한다.

마지막으로 slice(시작인덱스, 잘라낼 인덱스) 이렇게하면 마지막인덱스-1 번째 까지 추출하기 때문에 +1을 더해줘야한다.

 

 

 

문제2

첫번째 시도

function solution(strArr) {
    const lenArr = []
    strArr.forEach((item, index) => {
        lenArr[index] = item.length
    })

    lenArr.sort((a,b) => b-a)

    return lenArr[0]
}

 

뭐야 왜 틀리지? 했는데 문제에 가장 긴 문자열이 아니라 가장.... 많은 크기의 그룹을 리턴하라고 한다...ㅋㅋㅋㅋ 미안...

그래서

 

각 요소들의 길이를 저장한 배열을 만들고 그 배열에서 각 길이를 가진 요소들이 몇번 등장하는지 카운트 했다.

그리고 그 값은 map 객체로 { 요소의 길이 :  등장횟수} 이렇게 저장했다.

그 다음 여기에서 value들만 뽑아내서 Math.max로 최대 값을 꺼냈다.

 

function solution(strArr) {
    const lenArr = []
    const map = {}
    strArr.forEach((item, index) => {
        lenArr[index] = item.length
    })
    
    lenArr.forEach( item => {
        map[item] = (map[item] || 0) +1
    })
    
    const answer = Math.max(...Object.values(map))
    return answer
}

 

 

문제3

function solution(myStr) {
  let tempA = myStr.split("a");
  let tempB = [];
  let tempC = [];

  tempA.filter((item) => {
    if (item.length > 0) {
        item.split("b").filter((item)=> {
            if (item.length > 0) {
                tempB.push(item);
            }
        })     
  }
})
  
  tempB.map((item, index) => {
    if (item.length > 0 && item !== "c") {
      item.split("c").filter((item) => {
        item.length > 0 && tempC.push(item);
      })
    }
  });
  if(tempC.length <= 0) {
    return ["EMPTY"]
  }

  return tempC
}

 

ㅋㅋㅋ 걸러내고 걸러내고 하다보니 코드가 길어졌다.

첫번째로 "a"를 기준으로 split을 한 다음 각 요소의 길이 > 0  인것들을 대상으로 다시 split("b") 를 한다음 tempB에 저장했다. 그다음 다시 c를 걸러내는 작업을 한 다음 tempC의 길이가 0이면 ["EMPTY"]를 반환하도록 했다.

 

+) 다른사람 풀이

function solution(myStr) {
    const tmp1 = myStr.split("a").join("b")
    const tmp2 = tmp1.split("b").join("c")
    const tmp3 = tmp2.split("c").filter(x => x)
    if (tmp3.length === 0) return ["EMPTY"]
    return tmp3
}

음.... 나는 join으로 마지막에 땡겼을 때 요소들이 배열로 나눠질때 달라져서 일부러 순서대로 걸러낸거였는데

이 사람은 마지막에 filter(x => x)로 걸러낸건가...? 싶다

 

정규표현식

function solution(myStr) {
    const arr = myStr.split(/[abc]/).filter(e => e);
    return arr.length == 0 ? ["EMPTY"] : arr;
}

 

젠장... 정규 표현식으로 걸러내는 방법을 배웠다...

 

 

문제4

function solution(order) {
    let answer = 0
    
    order.forEach((item) =>{
        if(item === "iceamericano" || item=== "americanoice"|| item=== "hotamericano" || item === "americanohot" || item === "americano" || item === "anything"){
            answer += 4500
        }else if(item === "icecafelatte"|| item === "cafelatteice"|| item ==="hotcafelatte" || item === "cafelattehot" || item ==="cafelatte"){
            answer += 5000
        }
    })
    
    return answer
}

나는 그냥 냅다 조건문으로 전부 걸어버렸다ㅋㅋㅋ

 

 

+) 다른 사람 코드 참고 

function solution(order) {
  return order.reduce((acc, cur) => {
    if (cur.includes("americano")) {
      return acc + 4500;
    } else if (cur.includes("cafelatte")) {
      return acc + 5000;
    } else {
      return acc + 4500;
    }
  }, 0);
}

includes로 조건을 걸었더니 깔끔하다. 뜨거운 메뉴 ,차가운 메뉴 가격이 다를때 이렇게 써봐야겠다

 

 

문제 5

첫번째 시도

function solution(arr) {
    let stk = []
    for(let i=0; i <arr.length; i++){
        if(stk.length === 0){
            stk.push(arr[i])
        }else if(stk.length !==0 && stk[stk.length-1] === arr[i]){
            stk.pop()
        }else if(stk.length !==0 && stk[stk.length-1] !== arr[i]){
            stk.push(arr[i])
        }
    }
    if(stk.length <= 0){
        return [-1]
    }
    
    return stk
}

 

각 조건에 맞게 실행한다음  i에 1을 더해줘야 한다는 걸 안했다....

 

 

두번째 답

function solution(arr) {
    let stk = []
    let i = 0;
    
    while(i < arr.length){
        if(stk.length === 0){
            stk.push(arr[i])
            i +=1
        }else if(stk[stk.length-1] === arr[i]){
            stk.pop()
            i +=1
        }else if(stk[stk.length-1] !== arr[i]){
            stk.push(arr[i])
            i += 1
        }
    }
    if(stk.length <= 0){
        return [-1]
    }
    
    return stk
}

 

 

문제에서 지시한대로 조건문을 적었다 

728x90

'JS 코테' 카테고리의 다른 글

<Javascript-CT> 기초 DAY 23  (1) 2025.05.11
<Javascript-CT> 기초 DAY 22  (0) 2025.05.11
<Javascript-CT> 기초 DAY 21  (0) 2025.05.09
<Javascript-CT> 기초 DAY 19  (0) 2025.05.08
<Javascript-CT> 기초 DAY 18  (0) 2025.05.07