✨APS (Algorithm Problem Solving)/프로그래머스

[프로그래머스] LV.0 OX게임/ 자바(JAVA), 파이썬(Python)

Nyan cat 2022. 10. 4. 15:56

📜 문제 설명

덧셈, 뺄셈 수식들이 'X [연산자] Y = Z' 형태로 들어있는 문자열 배열 quiz가 매개변수로 주어집니다.

수식이 옳다면 "O"를 틀리다면 "X"를 순서대로 담은 배열을 return하도록 solution 함수를 완성해주세요.

 

제한사항

  • 연산 기호와 숫자 사이는 항상 하나의 공백이 존재합니다. 단 음수를 표시하는 마이너스 기호와 숫자 사이에는 공백이 존재하지 않습니다.
  • 1 ≤ quiz의 길이 ≤ 10
  • X, Y, Z는 각각 0부터 9까지 숫자로 이루어진 정수를 의미하며, 각 숫자의 맨 앞에 마이너스 기호가 하나 있을 수 있고 이는 음수를 의미합니다.
  • X, Y, Z는 0을 제외하고는 0으로 시작하지 않습니다.
  • 0 ≤ X, Y ≤ 10,000
  • 1 ≤ quiz의 원소의 길이 ≤ 20
  • [연산자]는 + 와 - 중 하나입니다.

 

입출력 예

["3 - 4 = -3", "5 + 6 = 11"] ["X", "O"]
["19 - 6 = 13", "5 + 66 = 71", "5 - 15 = 63", "3 - 1 = 2"] ["O", "O", "X", "O"]

🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/120907?language=java

 

 

 

programmers.co.kr

 

💡 문제 풀이

문제의 난이도 자체는 높지 않지만 은근히 잡아내기 힘든 함정이 한 가지 있어서 풀고 나서 나도 모르게 장난치나! (부산말)를 육성으로 외쳤다.. 

문제의 구현은 간단하다.

  1. 우선 split(" ") 함수를 통해 연산결과가 맞는지 확인해야 할 문자열을 리스트로 만든다.
  2. 만든 리스트에서 1번 인덱스는 + 또는 - 연산자이다.
  3. + 연산자일 경우 0번 인덱스와 2번 인덱스를 더한 값이 4번 인덱스가 맞는지 확인하고
    - 연산자일 경우 0번 인덱스에서 2번 인덱스를 뺀 값이 4번 인덱스가 맞는지 확인한다
  4. 맞을 경우 "O", 틀릴 경우 "X"를 넣어주면 된다.

금방 풀 수 있을 줄 알았는데 함정이 한 가지 있어서 잠깐 헤맸다. 테케 한개가 계속 런타임 에러가 났다.

1번 과정에서 split 함수를 통해 리스트로 만드는데 이 때 입출력 맨 앞칸에 공백이 있어서 런타임 에러가 발생하고 다음 과정을 진행하지 못했다. (예시 : [" 3 - 4 = -3"])

제한 사항에 연산자와 숫자 사이의 공백은 항상 한 칸이라는 말만 철썩같이 믿고 당연히 맨 앞에도 불필요한 공백은 없겠거니 생각했는데 아니었다... 이렇게 가끔 편견에 갇히면 작은 함정에도 오래 헤맨다

 

자바 풀이

class Solution {
    public String[] solution(String[] quiz) {
        String[] answer = new String[quiz.length];
        for (int i = 0; i < quiz.length; i++) {
        	// 확인해야 할 연산 결과를 배열로 만들어서 계산하기 쉽게
            // ** 이 부분에서 trim 함수를 통해 공백을 제거하지 않으면 틀림
            String[] tmpArray = quiz[i].trim().split(" ");
            
            // 문자열로 되어있는 변수들을 숫자형으로 바꿔주기
            int firstNum = Integer.parseInt(tmpArray[0].trim().replace(" ", ""));
            int secNum = Integer.parseInt(tmpArray[2].trim().replace(" ", ""));
            int resultNum = Integer.parseInt(tmpArray[4].trim().replace(" ", ""));
            
            // 연산자, + 혹은 -
            String opt = tmpArray[1].trim().replace(" ", "");
            
            // 연산자가 +일 경우 
            if (opt.equals("+")) {
                if (firstNum + secNum == resultNum) {
                    answer[i] = "O";
                } else {
                    answer[i] = "X";
                }
            // 연산자가 -일 경우 
            } else if(opt.equals("-")) {
                if (firstNum - secNum == resultNum) {
                    answer[i] = "O";
                } else {
                    answer[i] = "X";
                }
            }
          
        }
        
        return answer;
    }
}

 

파이썬 풀이

def solution(quiz):
    answer = []
    
    for i in range(len(quiz)):
    	# strip()을 통해 공백제거 해줘야지 통과 가능
        tmp = quiz[i].strip().split(" ")
        
        if tmp[1] == "+":
            if int(tmp[0]) + int(tmp[2]) == int(tmp[4]):
                answer.append("O")
            else:
                answer.append("X")
        elif tmp[1] == "-":
            if int(tmp[0]) - int(tmp[2]) == int(tmp[4]):
                answer.append("O")
            else:
                answer.append("X")
        
    return answer
반응형