요구사항
주어진 수식들 중 일부 결괏값이 '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
반응형
'코딩테스트 > PCCP' 카테고리의 다른 글
[프로그래머스] [PCCP 기출문제] 4번 / 수레 움직이기 (Java) (1) | 2025.03.04 |
---|---|
[프로그래머스] [PCCP 기출문제] 3번 / 충돌위험 찾기 (Java) (1) | 2025.02.18 |
[프로그래머스] [PCCP 기출문제] 2번 / 퍼즐 게임 챌린지 (Java) (2) | 2025.02.17 |
[프로그래머스] [PCCP 기출문제] 3번 / 아날로그 시계 (Java) (0) | 2025.02.17 |
[프로그래머스] [PCCP 기출문제] 2번 / 석유 시추 (Java) (1) | 2025.02.17 |