콜라 빈 병 2개를 가져다주면 콜라 1병을 주는 마트가 있다. 빈 병 20개를 가져다주면 몇 병을 받을 수 있는가?
단, 보유 중인 빈 병이 2개 미만이면, 콜라를 받을 수 없다.
계산 후 나머지가 생기면 다음 계산에 포함하는 식으로 접근하였다.
(현재 가진 병 = 받은 병 + 나머지) 으로 계산하였다. 위의 예시는 이렇게 된다.
(10+0) => (5+0) => (2+1) => (1+1)
class Solution {
public int solution(int a, int b, int n) {
int answer = 0;
// 이번에 받는 횟수 = (나머지 + 가진 병) / 줘야하는 수
// 나머지 = (나머지 + 가진 병) % 줘야하는 수
// 받은 병의 수 = 이번에 받는 횟수 * 받을 병 수
// 가진 병의 수 = 나머지 + 받은 병의 수
while(n >= a){
answer += n / a * b;
n = n % a + n / a * b;
}
return answer;
}
}
사실 주석처럼 생각하고 코드를 짰는데 다짜고 코드를 정리하고 나니 두줄 밖에 안남았다. 깔끔하니 좋았는데 어떤 사람은 한줄에 짰더라...
문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.
문자열 배열을 받아와서 정렬을 하는 문제였다.
문제는 문자열의 n번째 문자들을 비교해서 정렬하는 거였는데, 왠지 이전에 공부한 stream을 쓰면 쉽게 풀릴 것 같았다.
import java.util.*;
import java.util.stream.Collectors;
class Solution {
public String[] solution(String[] strings, int n) {
List<String> strList = Arrays.asList(strings); // String[] -> List<String>
List<String> str = strList.stream()
.map(el1 -> el1.charAt(n) + el1) // 비교할 문자를 맨 앞에 추가
.sorted() // 맨앞 문자로 정렬
.map(el2 -> el2.substring(1)) // 맨 앞 문자를 떼기
.collect(Collectors.toList()); // List화
return str.toArray(new String[0]); // List<String> -> String[]
}
}
확실히 for문 쓰고 if문 쓰는 것 보다 간결해졌다.
코드 작성이 길어질수록 생각이 복잡해진다는 것을 이번에 확실히 깨달았다.
어려웠던 부분은 오히려 String을 다루는 부분이었는데, substring, charAt 같은 기본적인 메소드는 이제 외워야할 때가 되지 않았나 싶다...ㅎㅎ