본문 바로가기
[ 다먹살 ]/- Coding

[프로그래머스] 레벨0 다항식 더하기

by 엉망으로살기 2022. 10. 24.
반응형

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

 

프로그래머스

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

programmers.co.kr

이 문제 같은 경우에는 구현 자체가 어렵진 않았는데 예외 케이스를 생각할 때 많아서 생각보다 정답률이 높지 않은 것 같다.

1. 가장 먼저 입력값 polynomial에 대한 예외처리를 해준다.

   1-1. 공백이 들어올 때는 무조건 0을 리턴하고, 숫자 한 개일 경우에는 무조건 그 숫자를 리턴한다.

2. +를 포함하고 있는 가장 일반적인 케이스는 Map 자료구조를 이용해 처리한다.

   2-1. 이 때, key값은 x와 단순 정수 2개로 나누고, 계수는 value값을 이용해 계속 저장해나간다.

   2-2. 만약 입력값이 "x"일 경우에는 계수 1을 붙여서 처리한다.

3. 그리고 전체 식을 다시 만들어준 후 결과값을 리턴한다.

  3-1. 이 때 x의 최종계수가 1이 아닐 때에는 value값을 가지고와서 "x"를 붙여주고, 최종계수가 1이라면 그냥 "x"만 붙여준다.

  3-2. x를 포함하는 식일 경우에는 항상 x를 먼저 나타내야하므로, cnt 변수를 통해 x를 포함하는 항과 정수를 나누어서 순서를 처리한다.


문제 및 예제


코드

import java.util.TreeMap;
import java.util.Map.Entry;

class Solution
{
    public String solution(String polynomial)
    {
        if(polynomial.equals(" ") || polynomial.equals(""))
        {
            return "0";
        }
        else if(polynomial.length()==1)
        {
            return polynomial;
        }
        
        StringBuilder answer = new StringBuilder();
        TreeMap<String, Integer> map = new TreeMap<String, Integer>();
        int cnt = 0;
        String[] value = polynomial.split("\\+");
        
        for(String s : value)
        {
            s = s.trim();
            int temp = -1;
            
            if(s.contains("x"))
            {
                if(s.length()==1)
                {
                    s = "1x";
                }
                
                temp = Integer.parseInt(s.replace("x",""));
                
                if(map.containsKey("-1"))
                {
                    map.put("-1", map.get("-1") + temp);
                }
                else
                {
                    map.put("-1", temp);
                }
            }
            else
            {
                temp = Integer.parseInt(s);
                
                if(map.containsKey("1"))
                {
                    map.put("1", map.get("1") + temp);
                }
                else
                {
                    map.put("1", temp);
                }
            }
        }
        
        for(Entry<String, Integer> e : map.entrySet())
        {
            if(e.getKey().equals("-1"))
            {
                if(e.getValue()!=1)
                {
                    answer.append(e.getValue());
                }
                answer.append("x");
                cnt++;
            }
            else
            {
                if(cnt!=0)
                {
                    answer.append(" + ");
                }
                
                answer.append(e.getValue());
            }
        }
        
        return answer.toString();
    }
}

반응형

댓글