-
[프로그래머스/JAVA] 콜라 문제Algorithm/Java 2024. 10. 30. 15:32
https://school.programmers.co.kr/learn/courses/30/lessons/132267
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 요약
빈 병 a개를 가져가면 콜라 b병을 주는 마트가 있다.
현재 n개의 빈 병이 있을 때, 상빈이가 받을 수 있는 콜라의 총 병 수를 계산하라.- 빈 병이 a개 이상이어야 교환 가능.
- 교환 후 남은 병은 다음 교환에 사용 가능.
[ 오답 노트 ]❌ 기존 오답 코드
class Solution { public int solution(int a, int b, int n) { // 빈 병 2개 -> 1개 줌 (==> 2) // (만약 빈 병 2개 -> 2개 준다면?) (==> 1) // ------------------- // 빈 병 20개 -> 10개 줌 // 빈 병 10개 -> 5개 줌 // 빈 병 5개 -> 2개 줌 .. 빈병 1개 남음 // 빈 병 2개 -> 1개 줌 // 빈 병 5개일 때 남은 1병 + 위에 1개 -> 1개 줌 // 총 10 + 5 + 2 + 1 + 1 = 19개 (정답) int answer = 0; int subsum = 0; // 나머지 병들? while(n > 0) { if(n % (a / b) != 0) { // 1 % (2) == 1 if(n == 1) { if(subsum > 0) { n += subsum; // n = 2 subsum = 0; }else { break; } } subsum += n % (a / b); // subsum = 5 % (2) = 1 } // a병을 가져다주면 b병을 줌 n = n / (a / b); // n = 2 / (2) = 1 answer += n; // 10 + 5 + 2 + 1 + 1 } return answer; } }
📌 기존 코드의 문제점1. 교환 계산이 잘못됨
- (a / b)는 교환 비율이 아니라 단순 나누기 결과일 뿐, 문제의 조건을 제대로 반영하지 못함.
- 올바른 계산은 (n / a) * b 형태로 처리해야 함.
2. subsum 변수의 불필요한 복잡성
- 남는 병 처리를 복잡하게 구현해 코드 가독성이 떨어짐.
- 남은 병은 단순히 n % a로 관리할 수 있음.
3. 종료 조건 미흡
n이 1일 때 종료 조건이 불분명하고, subsum 값에 의존해 비효율적인 로직이 추가됨.
[ 정답 코드 & 올바른 풀이 ]
📌 올바른 풀이1. 교환 조건
빈 병이 a개 이상이어야 콜라를 받을 수 있다.
반복문을 while (n >= a)로 설정.2. 교환 병 계산
n / a는 교환 가능한 횟수를 의미하며, 여기에 b를 곱해 실제로 받을 병 수를 구한다
3. 남은 병 처리
교환 후 남은 병은 n % a로 계산하고, 새로 받은 병과 합산해 다음 반복에 사용
📌 정답 코드class Solution { public int solution(int a, int b, int n) { int answer = 0; // 보유 중인 빈 병이 a개 미만이면, 추가적으로 빈 병을 받을 수 x while(n >= a) { // (만약 빈 병 2개 -> 2개 준다면?) // (빈 병 20개 -> 20개 줌) // 원래 교환 수에 한번 교환당 받는 병수를 곱해준다 int exchange = (n / a) * b; // 10 answer += exchange; // 10 + ... // 어차피 나머지가 0일때는 더할때 영향을 미치지 않으므로 if 조건 안나눠도 됌 n = (n % a) + exchange; } return answer; } }
반응형'Algorithm > Java' 카테고리의 다른 글
[프로그래머스/JAVA] 피보나치 수 (0) 2024.10.30 [프로그래머스/JAVA] 이진 변환 반복하기 (0) 2024.10.30 [프로그래머스/JAVA] 문자열 내 마음대로 정렬하기 (0) 2024.10.29 [프로그래머스/JAVA] 숫자 문자열과 영단어 (2021 카카오 채용연계형 인턴십 문제) (0) 2024.10.29 [프로그래머스/JAVA] 두 개 뽑아서 더하기 (0) 2024.10.29