해당 문제의 경우, 나누기(/)와 나머지(%) 연산자를 활용해 풀 수 있었는데요.오랜만에 푸는 코테 문제라 1시간 30분을 까먹었네요 ㅎ...
아무튼 제가 이해한 걸 사이클 순대로 설명드려보자면, 핵심은 다음과 같을 것입니다.
- 연산을 할 쿠폰 수가 10이 될때까지(10장이 있어야 치킨을 사먹을 수 있는데 10장 이하라면 사먹을 수 없으니 그 만큼 범위를 지정해줌.) while문을 반복
- 쿠폰 열 장에 치킨 한 마리 이므로 전체 쿠폰에서 나누기 10을 연산
- 얻어진 결과값을 result 변수에 저장 후
- 전체 다음으로 연산할 쿠폰 개수를 처음 전체 쿠폰을 10으로 나눈 몫(10장이 되어서 치킨 1마리를 시키고 받은 쿠폰 하나)과 10으로 나눈 나머지 값(10장이 안되서 남아있는 잔존 쿠폰)을 각각 더합니다.
- 더한 값으로 다음 사이클에 1번부터 4번까지의 과정을 쿠폰이 총 10장 미만일 때까지 실행한 후 while문이 종료되면 도출 된 result를 반환
음... 글로 설명하면 이해가 안가실테니 사이클 당 쿠폰 개수와 누적 개수를 상세히 말씀드려 보겠습니다.
첫번째 사이클 : 쿠폰이 1081개 이므로 OK
전체 쿠폰 (1081) / 10 (10마리 상수) = 108 (쿠폰으로 사먹은 후 받은 쿠폰) | result = 0 + 108 & coupon = 108(받은 쿠폰) + 1 (1081 쿠폰을 쓸 때 다 쓰지 못하고 남아있던 쿠폰) = 109두번째 사이클 : 쿠폰이 109개 이므로 OK
전체 쿠폰 (109) / 10 (10마리 상수) = 10 (쿠폰으로 사먹은 후 받은 쿠폰) | result = 108 + 10 & coupon = 10(받은 쿠폰) + 9 (1081 쿠폰을 쓸 때 다 쓰지 못하고 남아있던 쿠폰) = 19세번째 사이클 : 쿠폰이 19개 이므로 OK
전체 쿠폰 (19) / 10 (10마리 상수) = 1 (쿠폰으로 사먹은 후 받은 쿠폰) | result = 118 + 1 & coupon = 1(받은 쿠폰) + 9 (1081 쿠폰을 쓸 때 다 쓰지 못하고 남아있던 쿠폰) = 10네번째 사이클 : 쿠폰이 10개 이므로 OK
전체 쿠폰 (10) / 10 (10마리 상수) = 1 (쿠폰으로 사먹은 후 받은 쿠폰) | result = 119 + 1 & coupon = 1(받은 쿠폰) + 0 (1081 쿠폰을 쓸 때 다 쓰지 못하고 남아있던 쿠폰) = 1다섯번째 사이클 : 쿠폰이 1개 남았으므로 while문 조건에 부합하지 않아 종료 후 result를 반환
글로 정리를 하긴 했지만, 아래의 코드를 보시면 이해가 되실거라 생각합니다!
- 자바 버전
class Solution { public int solution(int chicken) { int coupon = chicken; int result = 0; while(coupon >=10){ int temp = coupon/10; result += temp; coupon = (temp + (coupon%10)); } return result; } }
- 자바스크립트 버전
function solution(chicken) { let coupon = chicken; let result = 0; while(coupon >=10){ let temp = Math.floor(coupon/10); result += temp; coupon = (temp + (coupon%10)); } return result; }