728x90
반응형

문제


해결 방안
오답
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
// 공통 분모 찾기
int remainder = -1;
if(denom1 > denom2) {
remainder = denom1%denom2;
} else {
remainder = denom2%denom1;
}
int resultNumer = -1;
int resultDenom = -1;
if(remainder == 0) { // 공통 분모 존재
if(denom1 > denom2) {
answer[0] = numer1 + numer2*(denom1/denom2);
answer[1] = denom1;
} else {
answer[0] = numer2 + numer1*(denom2/denom1);
answer[1] = denom2;
}
} else { // 공통 분모 미존재
resultNumer = numer1*denom2 + numer2*denom1;
resultDenom = denom1*denom2;
answer[0] = resultNumer;
answer[1] = resultDenom;
}
return answer;
}
}
나머지 연산을 활용해서 나머지가 0이라면 더 큰 분모를 공통 분모로 활용하고
그렇지 않다면 분모의 곱을 통한 연산을 한다고 판단하여 if-else를 통해 로직을 작성했어요.
코드 실행 결과는 통과했지만
테스트 케이스 1, 2, 3, 5, 6, 7, 8, 9, 10, 13에서 막혔습니다.
포인트는 기약 분수였습니다.
예를 들어 1/2 + 1/2를 할 경우 제 코드는 [2, 2]를 반환하지만 기약 분수로 변환하면 [1, 1]이 나오는게 정답입니다.
정답
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
// 분수 계산
answer[0] = numer1*denom2 + numer2*denom1;
answer[1] = denom1*denom2;
// 기약 분수 처리
int g = gcd(answer[0], answer[1]);
answer[0] /= g;
answer[1] /= g;
return answer;
}
private int gcd(int a, int b) {
while (b != 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}
}
기약 분수 처리(약분 처리)를 하기 때문에 앞에서 공통 분모 찾느라 if-else를 사용하지 않아도 되서
훨씬 코드가 간결해집니다.
gcd(최대공약수)에 대해서는 아래 글에서 더 자세히 포스팅했습니다.
작년 이 맘 때쯤 올린 글인데 그새 기억이 안 났다.. 언어를 배우는 것과 마찬가지로 알고리즘도 꾸준히 안하면 잊혀지는 듯하다.
[백준/Java] 2609번 최대공약수와 최소공배수
문제 정답import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.StringTokenizer;public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedRea
eune7.tistory.com
728x90
반응형
'Computer Science (CS) > 알고리즘' 카테고리의 다른 글
| [프로그래머스] 두 수의 나눗셈 (0) | 2025.12.04 |
|---|---|
| [백준/Java] 10828번 스택 (0) | 2024.11.18 |
| [백준/Java] 10845번 큐 (0) | 2024.11.18 |
| [백준/Java] 9012번 괄호 (1) | 2024.11.17 |
| [백준/Java] 2164번 카드2 (0) | 2024.11.03 |