요구사항

주어진 수식들 중 일부 결괏값이 'X'표시로 지워져 있으며, 수식은 2~9진법 중 하나의 진법을 사용할 때

지워진 수식을 완성하여 출력하기

(가능한 결괏값이 여러개인 경우 ?로 표시)

 

 

입력 값

String[] expressions 수식 문자열 배열
expresiion[i]는 A + B = C 혹은 A - B = C 형태의 문자열
A, B는 음이 아닌 2자리 이하의 정수
C는 음이 아닌 세자릿수 이하의 정수

 

 

풀이

1. 수식의 확인하고 저장할 변수 생성

List<Integer> numbers = new ArrayList<>(Arrays.asList(2,3,4,5,6,7,8,9)); 사용 가능한 진법 숫자를 담은 List
초기 값은 2~9 까지의 정수
List<String> unsolves = new ArrayList<>(); 지워진 수식을 담을 List
String fNum, sNum, rNum; 수식에서 추출할 정수 3개를 담을 문자열
int oper; 수식에서 추출할 수식을 담을 숫자

 

2. 수식 전체를 탐색

    -> 공란으로 수식을 잘라서 0번째는 첫번째 숫자(fNum), 2번째는 두번째 숫자(sNum), 4번째는 세번째 숫자(rNum) 저장

    -> 1번째는 연산부호로 + 인 경우 +1을 -인 경우 -1을 oper 에 저장

    -> 4번째 숫자가 "X" 인 경우 지워진 수식 List(unsolves) 에 추가

 

3. 사용 가능한 진법 별로 수식 연산 하여 불가능한 수식은 진법 리스트(numbers) 에서 제외 처리

    -> 주어진 진법으로 변환하지 못하는 숫자가 포함된 경우 제외 (= 진법과 같거나 큰 숫자라 표현할수 없는 숫자)
    -> 정상 수식일때 주어진 정답과 다르면 제외

 

4. 가능한 진법 숫자 리스트를 통해 지워진 수식 List 별로 정답 재 작성하기

    -> 숫자 별 정답 생성하여 하나라도 다른 정답이 있는 경우 X?로 변환

    -> 모두 같은 정답인 경우 X를 정답으로 변경  

 

5. 재 작성 된 수식 return

 

 

728x90

 

Java 코드

import java.util.*;

class Solution {
    public String[] solution(String[] expressions) {
        String[] answer = {};
        
        List<Integer> numbers = new ArrayList<>(Arrays.asList(2,3,4,5,6,7,8,9));
        List<String> unsolves = new ArrayList<>();
        String fNum, sNum, rNum;
        int oper;
        
        for(String expression : expressions) {
            fNum = expression.split(" ")[0];
            sNum = expression.split(" ")[2];
            rNum = expression.split(" ")[4];
            oper = "+".equals(expression.split(" ")[1]) ? 1 : -1;
            
            if("X".equals(rNum)) unsolves.add(expression);

            for(int i=2; i<=9; i++) {
                if(numbers.indexOf(i) == -1) continue;
                
                try {
                    if("X".equals(rNum)) {
                        // 변환 가능한지 여부만 체크
                        Integer.parseInt(fNum, i);
                        Integer.parseInt(sNum, i);
                    } else if(Integer.parseInt(fNum, i) + Integer.parseInt(sNum, i) * oper
                       != Integer.parseInt(rNum, i)) throw new NumberFormatException();
                } catch (NumberFormatException e) {
                    numbers.remove(numbers.indexOf(i));
                }
            }
        }
        
        answer = new String[unsolves.size()];
        String result, nowVal;
        
        for(int i=0; i<unsolves.size(); i++) {
            result  = "";
            fNum    = unsolves.get(i).split(" ")[0];
            oper    = "+".equals(unsolves.get(i).split(" ")[1]) ? 1:-1;
            sNum    = unsolves.get(i).split(" ")[2];
            
            for(int n : numbers) {
                nowVal = Integer.toString(Integer.parseInt(fNum, n) + Integer.parseInt(sNum, n)*oper, n);
                
                if(!"".equals(result) && !nowVal.equals(result)) {
                    result = "?";
                    break;
                }
                
                result = nowVal;
            }
            
            answer[i] = unsolves.get(i).replace("X", result);
        }
        
        return answer;
    }
}

 

 

문제 출처

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

728x90
반응형

+ Recent posts