오늘 학습한 내용
- Java : 내일배움캠프 Java 종합반 수강
- 프로그래머스 문제풀이
문제상황
오늘 아주 사소하지만 자주 일어날 수 있는 실수를 했었다..
문제는 '분수의 덧셈'이다.
문제링크
https://school.programmers.co.kr/learn/courses/30/lessons/120808
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
시도한 내용
우선 나의 풀이 과정을 설명하면
- 분모의 최소공배수를 구한다.
- 분자는 각각 numer*(최소공배수/denom)이 된다.
- 분모는 최소공배수 분자는 서로 더해주면 정답이 된다.
최소 공배수를 구하는 방법은 '두 수와 최대공약수, 최소공배수 사이의 관계'를 알면 쉽게 구할 수 있다.
두 수 A, B의 최대공약수를 G, 최소공배수를 L이라 하면 다음이 성립한다.
A×B = G×L
그렇게 작성한 로직은 다음과 같다.
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int gcd = 1;
for (int i=1; i<=denom1 && i<=denom2; i++) {
if (denom1%i==0 && denom2%i==0) {
gcd = i;
}
}
int lcm = denom1*denom2/gcd;
int a = numer1*(lcm/denom1);
int b = numer2*(lcm/denom2);
int[] answer = {a+b, lcm};
return answer;
}
}
여기서 처음에 제출을 했었는데 실패가 나왔었다..
지금 생각해보면 당연하지만 문제에서 기약 분수라는 조건을 고려하지 않아서 실패가 나왔던 것이다.
그래서 위와 똑같은 방법으로 최종적으로 분모, 분자의 최대 공약수를 구해서 나누는 과정을 수행하는 로직을 작성했다.
for (int i=1; i<=a+b && i<=lcm; i++) {
if (a+b%i==0 && lcm%i==0) {
gcd2 = i;
}
}
그런데도 결과는 계속해서 실패가 되었다..
이해가 되지 않아서 결국 intellij로 디버깅을 했고 정말 사소한 실수 하나로 내가 작성한 코드가 완전히 잘못된 것을 알게 되었다.
바로 'a+b%i' 부분에서 연산의 우선순위를 고려하지 않았던 것이다.... 로직을 수정하니 결과는 통과가 되었다!!
해결
나의 최종 풀이 코드는 다음과 같다.
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int gcd = 1, gcd2 = 1;
for (int i=1; i<=denom1 && i<=denom2; i++) {
if (denom1%i==0 && denom2%i==0) {
gcd = i;
}
}
int lcm = denom1*denom2/gcd;
int a = numer1*(lcm/denom1);
int b = numer2*(lcm/denom2);
for (int i=1; i<=a+b && i<=lcm; i++) {
if ((a+b)%i==0 && lcm%i==0) {
gcd2 = i;
}
}
int molecule = (a+b)/gcd2;
int denominator = lcm/gcd2;
int[] answer = {molecule, denominator};
return answer;
}
}
알게된 내용
수학을 공부했을 때에도 정말 사소한 계산실수나 문제를 잘못 읽어서 실수를 했던 경우가 많았었는데,,
코딩 문제를 풀면서도 이러한 실수를 할 수 있구나라는 사실을 알게되었다.
앞으로는 문제의 조건, 정말 사소한 로직이라도 꼼꼼하게 작성하는 연습을 해야겠다는 다짐을 하게 되었다!
'TIL&WIL' 카테고리의 다른 글
| 2023-05-26 (Java : 예외 처리 복습, 빠른 입출력) (0) | 2023.05.26 |
|---|---|
| 2023-05-25 TIL (Java 문법 학습, 프로그래머스 문풀) (0) | 2023.05.25 |
| 2023-05-23 TIL (Java : Collections Framework, 프로그래머스 문풀) (0) | 2023.05.23 |
| 2023-05-22 TIL (Java : 비트 연산자, 배열에서의 복사) (0) | 2023.05.22 |
| 2023-05 3주차 WIL (0) | 2023.05.19 |