코딩 테스트/프로그래머스

[프로그래머스] 수식 최대화

2023. 5. 26. 18:25
목차
  1. 📙 1. 문제
  2. 문제 설명
  3. 풀이 1 : 내 풀이
  4.  풀이 2 : 다른 사람 풀이
  5. 🤔 2. 느낀 점
  6. 🤩 3. 한 번 더 짚고 갈 점

📙 1. 문제

Link : https://school.programmers.co.kr/learn/courses/30/lessons/67257

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

풀이 1 : 내 풀이

풀이 과정

  1. expression은 문자열이므로 split을 이용하여 숫자를 분리하고, filter를 이용해 문자(연산자)를 분리한다.
    • split(/*+-/g) : 정규표현식을 이용하여 *혹은 + 혹은 -을 기준으로 숫자를 분리한다.
    • filter(it=>isNaN(it)) : 숫자가 아닌 것을 filter하여 *,+,-을 분리한다.
  2. 37번 째 줄의 forEach문 : +, -, *(연산자)중 무엇을 먼저 계산할 지 결정한다. [1,2,0]이라면-,*,+순으로 계산한다.
  3. calculate 함수 : 받은 연산자 리스트를 forEach를 이용하여 하나씩 실행한다
  4. calculateEach 함수 : 연산자 배열에서 현재 연산자에 해당하는 값을 찾아, 없다면(-1이라면) while문을 종료하고, 있다면 연산자 배열이라면 제거하고 numArr배열이라면 2개 값을 계산된 값으로 대체한다.
    • exArr.indexOf(calculateNow) : 현재 연산자에 해당하는 값 찾기
  5. calculateIt 함수 : 2개의 숫자와 주어진 연산자로 계산을 수행하여 return한다.

 

function solution(expression) {
    var answer = 0;
    
    const calculateIt = (a,b,expression) => {
        [a,b] = [+a,+b]
        if(expression==='*') return a*b;
        if(expression==='+') return a+b;
        if(expression==='-') return a-b;
    }
    
    const calculateEach = (numArr,exArr,calculateNow) => {
        let thisPos = exArr.indexOf(calculateNow);
        while(thisPos!==-1){
            const result = calculateIt(numArr[thisPos],numArr[thisPos+1],calculateNow)
            exArr.splice(thisPos,1);
            numArr.splice(thisPos,2,result);
            thisPos = exArr.indexOf(calculateNow);
        }
        return numArr[0]
    }
    
    const express = ['+','-','*']
    const calculate = (numArr,exArr, item) => {
        item.forEach(it=>{
            expression = calculateEach(numArr,exArr, express[it])
        })
        return expression
    }
    
    const cases = [
        [0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]
    ]
    
    const numArr = expression.split(/[*+-]/g);
    const exArr = expression.split('').filter(it=>isNaN(it))
    
    cases.forEach(item=>{
        const numArrDup = [...numArr];
        const exArrDup = [...exArr]
        const result = calculate(numArrDup,exArrDup,item)
        answer = Math.max(answer,result>0?result:(-1)*result)
    })
    
    return answer;
}

 

 풀이 2 : 다른 사람 풀이

출처 : https://yoon-dumbo.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%98%EC%8B%9D-%EC%B5%9C%EB%8C%80%ED%99%94-javascript

 

[프로그래머스] 수식 최대화 - javascript

문제 [programmers.co.kr/learn/courses/30/lessons/67257] 문제 설명 IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다. 이번 대회에서는 우승

yoon-dumbo.tistory.com

풀이 과정

  1. for of문을 이용하여 연산자 우선순위 배열을 탐색한다.
  2. 연산자를 분리한다.
    • expression.split(/(\D)/) : 정규표현식 - 숫자를 기준으로 분리
  3. for of문을 이용하여 연산자 우선순위 배열을 우선순위 별로 하나씩 탐색한다.
    • for (let exp of opCand)
  4. 연산자 배열이 이 문자를 포함할 때까지 반복한다.
    • while(temp.includes(exp))
  5. 문자를 포함한다면, 제외하고, 계산을 수행한다.
    • temp.splice(idx-1,3,eval(temp.slice(idx-1,idx+2).join('')))
    • eval : 문자열을 계산하는 메소드
function solution(expression) {
    const prior = [
        ['-', '*', '+'],
        ['-', '+', '*'],
        ['*', '-', '+'],
        ['*', '+', '-'],
        ['+', '-', '*'],
        ['+', '*', '-']
    ];
    let cand = [];

    for (let opCand of prior) {
        const temp = expression.split(/(\D)/);
        for (let exp of opCand) {
            while (temp.includes(exp)) {
                const idx = temp.indexOf(exp)
                temp.splice(idx - 1, 3, eval(temp.slice(idx - 1, idx + 2).join('')));
            }
        }
        cand.push(Math.abs(temp[0]));
    }
    return Math.max(...cand);
}

 

 


🤔 2. 느낀 점

내가 처음에 알고리즘을 고민하고 코드를 작성할 때, '이게 맞을까?', '실수는 없을까?'하는 생각이 들었다. 그러나, 고민만 하지 않고 실제로 코드를 실행해보니, 나의 걱정은 허울이었다. 첫 시도에서는 간단한 에러들이 있었지만, undefined 오류나 함수명 중복 같은 문제를 해결하고 나니, 나의 코드는 문제를 순조롭게 해결하였다.
이전에는 이런 복잡하거나 긴 문제들을 보면 쉽게 포기했었지만, 이번에는 도전해보았다. 그 결과, 내가 기대했던 것 이상의 좋은 결과가 나왔다. 이 경험을 통해 배운 것은, 복잡하고 어려워 보이는 문제에도 두려워하지 않고 도전해보는 것의 중요성이다.
앞으로도 이렇게 보기에 복잡하고, 어려운 문제라도 도전의 자세를 가져보자. 문제를 해결하는 과정에서 생기는 작은 오류들은, 나의 코드를 더 완벽하게 만들어주는 계기가 될 것이다. 그리고 그 과정 속에서 나는 더욱 성장할 수 있을 것이다.

 

🤩 3. 한 번 더 짚고 갈 점

1. 정규표현식의 편리함과 소중함을 한 번 더 느낄 수 있었다. 정규표현식은 정말 복잡한 식을 간결한 식으로 바꿔주는 '마법'이다.

저작자표시 (새창열림)

'코딩 테스트 > 프로그래머스' 카테고리의 다른 글

[프로그래머스] 개인정보 수집 유효기간  (0) 2023.06.19
[프로그래머스] 표 병합  (0) 2023.05.21
[프로그래머스] 코딩테스트 공부  (0) 2023.05.20
[프로그래머스] 표현 가능한 이진트리  (1) 2023.05.19
[프로그래머스] 거리두기 확인하기  (0) 2023.05.14
[프로그래머스] 방금 그곡  (1) 2023.05.13
[프로그래머스] 후보키  (0) 2023.05.12
[프로그래머스] 문자열 압축  (0) 2023.05.11
  1. 📙 1. 문제
  2. 문제 설명
  3. 풀이 1 : 내 풀이
  4.  풀이 2 : 다른 사람 풀이
  5. 🤔 2. 느낀 점
  6. 🤩 3. 한 번 더 짚고 갈 점
'코딩 테스트/프로그래머스' 카테고리의 다른 글
  • [프로그래머스] 개인정보 수집 유효기간
  • [프로그래머스] 표 병합
  • [프로그래머스] 코딩테스트 공부
  • [프로그래머스] 표현 가능한 이진트리
피터s
피터s
1년차 프론트엔드 개발자입니다 😣 아직 열심히 배우는 중이에요! 리액트를 하고있어요 :) - gueit214@naver.com - https://github.com/gueit214
피터s
피터의 성장기록
피터s
전체
오늘
어제
  • 분류 전체보기 (200)
    • 코딩 테스트 (25)
      • 프로그래머스 (16)
      • LeetCode (8)
      • 백준 (1)
    • 개발 독서 일지 (1)
    • 기업 분석 (4)
    • 개발 일지 (19)
      • 최신기술 도전기 (1)
      • 에러 처리 (5)
      • 개발 일지 (12)
    • 개발 일상 (36)
      • 개발 회고 (22)
      • 개발 이야기 (12)
      • 개발 서적 (1)
    • 취업 관련 지식 (11)
    • 알고리즘 (17)
    • WebProgramming (84)
      • WebProgramming (8)
      • HTML (5)
      • CSS (8)
      • JS (21)
      • React (40)

블로그 메뉴

  • About
  • 2022년 개발 성장기
  • 앞으로의 계획
  • github
  • 일상 blog

공지사항

인기 글

태그

  • LV2
  • Union-find
  • 1년 회고
  • 개발 is life
  • Kakao Tech Internship
  • 함수
  • 반복문
  • KAKAO BLIND
  • lv3
  • Retry
  • 구름톤
  • 카카오 채용연계형 인턴십
  • 개발 일상
  • 누적합
  • BFS
  • 구름
  • 스터디 후기
  • 해커톤
  • 카카오
  • 1일 1커밋 후기
  • 개발 회고
  • dfs

최근 댓글

최근 글

hELLO · Designed By 정상우.
피터s
[프로그래머스] 수식 최대화
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.