Algorithms/프로그래머스

[프로그래머스] '문자열 계산하기' - Java

LEFT 2023. 5. 13. 15:39

<문제 제시>

<문제설명>
my_string은 "3 + 5"처럼 문자열로 된 수식입니다. 
문자열 my_string이 매개변수로 주어질 때, 
수식을 계산한 값을 return 하는 solution 함수를 완성해주세요.

<예시 입출력>


<문제 해결 과정>

문자열로된 수식이 주어지면 각 토큰별로 분석하여 실제 결과값을 출력하는 문제이다.

수식의 인자가 두 자리 수 일때는 토큰으로 인식하여 한자리수 연산밖에 하지 못하는 문제 발생할 수 있어

리스트나 배열로 바꾸어 처리해볼 수 있었다.

Try 1) 

String my_string = "11 - 13";
int answer = 0;

my_string = my_string.replaceAll(" " , "");
String cc = "";
char c;
String[] temp = new String[2];

int k = 0;
for(int i = 0; i < my_string.length(); i++) {
    c = my_string.charAt(i);
    System.out.println("c = " + c);

    if(c == '+' || c == '-') {
        temp[k] = cc;
        k++;
        continue;
    }
    cc += my_string.charAt(i);
    System.out.println("cc = " + cc);
}

System.out.println(Arrays.toString(temp));

연산자 앞 뒤의 숫자를 모두 분리해내고 싶었지만, 뒤의 숫자는 인식하지 못하는 문제가 있었음

split()함수를 사용해서 개선해보고자 하였다.

Try 2)

int answer = 0;
        
String[] temp = new String[2];
String op = "";

my_string = my_string.replaceAll(" " , "");
if(my_string.contains("+")) {
    temp = my_string.split("\\+");
    op = "plus";
}
else if(my_string.contains("-")) {
    temp = my_string.split("\\-");
    op = "minus";
}

int sum = 0;
if(op.equals("plus")){
     sum = Integer.parseInt(temp[0]) + Integer.parseInt(temp[1]);	
}
else if(op.equals("minus")){
     sum = Integer.parseInt(temp[0]) +- Integer.parseInt(temp[1]);	
}

answer = sum;

return answer;

 

런타임 에러 발생으로 오답이었다. 테스트케이스 8,9번은 통과하였지만, 런타임 에러 발생이었다.

my_string = my_string.replaceAll("+", "");

에서는 연산자(+)는 특별한 의미를 가지므로, "\\+" 로 써주어야 정상작동한다.

my_string = my_string.replaceAll("\\+", "");

Solution 1)

String[] temp = my_string.split(" ");
        
int answer = Integer.parseInt(temp[0]);


for(int i = 1; i < temp.length; i += 2) {
    if(temp[i].equals("+")) {
        System.out.println("temp[i] = " + temp[i]);
        answer += Integer.parseInt(temp[i+1]);
        System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);

    }
    // - 가 입력되었을 경우 
    else {
        System.out.println("temp[i] = " + temp[i]);
        answer -= Integer.parseInt(temp[i+1]);
        System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
    }
}

return answer;

 

반복문에서 인덱스 증가값과 조건문 처리 부분을 수정하여 해결할 수 있었다.

answer에 첫번째 인자값은 미리 누적시키고 (temp[0])

for문에서는 i=1부터 반복하여, temp[i]부터 연산자를 판단하여 계산한다.


<전체코드>

public class calc_string {
	
	public static int solution(String my_string) {
        String[] temp = my_string.split(" ");
        
        int answer = Integer.parseInt(temp[0]);
        
        
        for(int i = 1; i < temp.length; i += 2) {
        	if(temp[i].equals("+")) {
        		System.out.println("temp[i] = " + temp[i]);
        		answer += Integer.parseInt(temp[i+1]);
        		System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
        		
        	}
        	// - 가 입력되었을 경우 
        	else {
        		System.out.println("temp[i] = " + temp[i]);
        		answer -= Integer.parseInt(temp[i+1]);
        		System.out.println("answer = " + answer + ", temp[i+1] = " + temp[i+1]);
        	}
        }
        
        return answer;
    }
	
	public static void main(String[] args) {
		String my_string = "11 - 13";
		
		System.out.println(solution(my_string));
	}

}

문자열 상의 수식을 split()메서드와 equals() 메서드를 통해 토큰 별로 나누고 연산에 활용할 수 있었다.


문제링크)
https://school.programmers.co.kr/learn/courses/30/lessons/120902

 

프로그래머스

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

programmers.co.kr