Algorithms/프로그래머스

[프로그래머스] 'OX 퀴즈' - Java

LEFT 2023. 4. 16. 18:08

<문제 제시>

<문제설명>
덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다. 수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

<예시 입출력>


<문제 해결 과정>

String타입으로 주어진 배열 안의 식을 연산하는 문제이다.

먼저 인덱스 별로 "인자1 (연산자) 인자2 부등호 결과값"이 주어진다.

실제 데이터로 표현하면 "3 - 4 = - 3" 이다.

이 데이터를 토큰별로 떼어내어 저장함과 동시에 이 수식이 맞는지 아닌지의 진위여부 또한 파악해야하는 문제이다.

먼저 3 - 4 = - 3처럼 띄어쓰기 포함해서 주어진 데이터를 저장할 수 있어야했다.

String[] answer = new String[quiz.length];
        
for(int i = 0; i < quiz.length; i++) {
    String data = quiz[i];
    String[] arr = data.split(" ");
}

main함수에서 String[] array 를 통해 값을 입력받고, solution 함수에서 그 배열을 받아와 그 배열의 길이만큼의 

새로운 배열(answer)을 만든다.

quiz배열의 인덱스마다 split을 진행한다. "3 - 4 = -3"이면

arr[0] = "3"
arr[1] = "-"
arr[2] = "4"
arr[3] = "="
arr[4] = "-3" 이 저장된다.

이렇게 5가지의 배열 데이터가 있고 이 데이터들은 그 위치에 맞게 기능을 한다.

arr[0] 과 arr[2]는 인자1, 2일 것이고,

arr[1]은 연산자일 것이다.

arr[4]는 최종 결과값일 것이다.

이를 활용하여 이중 for문을 통해 연산을 한다.

String타입이므로 .equals() 메서드를 통해 if문을 작성해주었다.

for(int j = 0; j < arr.length; j++) {
        		
    if(arr[1].equals("+")) {
        int compare = Integer.parseInt(arr[0]) + Integer.parseInt(arr[2]);
        if(compare == Integer.parseInt(arr[4])) answer[i] = "O";
        else if(compare != Integer.parseInt(arr[4])) answer[i] = "X";
    }

    else if(arr[1].equals("-")) {
        int compare = Integer.parseInt(arr[0]) - Integer.parseInt(arr[2]);
        if(compare == Integer.parseInt(arr[4])) answer[i] = "O";
        else if(compare != Integer.parseInt(arr[4])) answer[i] = "X";
    }
}

문제에서 연산자는 +와 -만 주어진다고 했으니 조건을 두개 만들어놓는다.

arr[1]은 연산자 위치이므로 이 연산자가 "+"와 일치하는지 "-"와 일치하는지에 따라 판단해주면된다.

String타입 데이터이므로 Integer.parseInt()를 통해 정수형으로 바꿔준 후 연산해주었다.


<전체코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

// #. OX퀴즈
public class ox_quiz {

	public static String[] solution(String[] quiz) {
        String[] answer = new String[quiz.length];
        
        for(int i = 0; i < quiz.length; i++) {
        	String data = quiz[i];
        	String[] arr = data.split(" ");
        	
        	for(int j = 0; j < arr.length; j++) {
        		
        		if(arr[1].equals("+")) {
        			int compare = Integer.parseInt(arr[0]) + Integer.parseInt(arr[2]);
        			if(compare == Integer.parseInt(arr[4])) answer[i] = "O";
        			else if(compare != Integer.parseInt(arr[4])) answer[i] = "X";
        		}
        		
        		else if(arr[1].equals("-")) {
        			int compare = Integer.parseInt(arr[0]) - Integer.parseInt(arr[2]);
        			if(compare == Integer.parseInt(arr[4])) answer[i] = "O";
        			else if(compare != Integer.parseInt(arr[4])) answer[i] = "X";
        		}
        	}
        }
        return answer;
    }
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] array = {"3 - 4 = -3", "5 + 6 = 11"};
		
		System.out.println(Arrays.toString(solution(array)));
	}
}

split이 띄어쓰기를 제외한 값들을 모두 찾아낸다는 것이 이번 알고리즘에서 핵심 해결 요소였다.

인덱스 별로 띄어내어 새로운 String타입 배열에 넣는 과정도 중요했다.


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

 

프로그래머스

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

programmers.co.kr