- 개미 군단
장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return
class Solution {
public int solution(int hp) {
int answer = 0;
answer = hp / 5 + hp % 5 / 3 + hp % 5 % 3;
return answer;
}
}
- 모스 부호
import java.util.*;
class Solution {
public String solution(String letter) {
String answer = "";
String[] morse = {
".-","-...","-.-.","-..",".","..-.",
"--.","....","..",".---","-.-",".-..",
"--","-.","---",".--.","--.-",".-.",
"...","-","..-","...-",".--","-..-",
"-.--","--.."
};
String [] morselist;
morselist = letter.split(" ");
for (String s: morselist){
for (int j=0; j<morse.length; j++){
if(s.equals(morse[j]))
answer += (char) (j+ 97);
}
}
return answer;
}
}
처음에는 해쉬맵을 사용하여 ( "._" , "a" ) 로 put해주려했으나 여러개를 한번에 추가하는 함수가 없으니 morse부호를 담은 배열을 만들기로 결정.
- 가위 바위 보
class Solution {
public String solution(String rsp) {
String answer = "";
String [] rsplist = rsp.split("");
for (int i=0; i<rsplist.length; i++){
answer += rsplist[i].equals("0") ? "5" : rsplist[i].equals("2") ? "0" : rsplist[i].equals("5") ? "2" : null;
}
return answer;
}
}
다른 사람의 풀이
import java.util.Arrays;
import java.util.stream.Collectors;
class Solution {
public String solution(String rsp) {
return Arrays.stream(rsp.split("")).map(s -> s.equals("2") ? "0" : s.equals("0") ? "5" : "2").collect(Collectors.joining());
}
}
stream을 이용.
- 구슬을 나누는 경우의 수
오랜만에 보는 이항계수. 처음에는
class Solution {
public int solution(int balls, int share) {
int answer = 1;
int dividend = 1;
int divisor = 1;
for (int i = 1; i<= balls-share + 1; i++){
dividend *= balls;
divisor *= share;
balls--;
share--;
}
answer = dividend / divisor;
return answer;
}
}
이런식으로 하려 했다. 사실 이 로직은 해당 자연수의 완전한 팩토리얼을 구하는 것이 아니라서 런타임 에러가 날 거라고 생각하지 않았는데 30C29는 팩토리얼이나 마찬가지이므로 런타임 에러가 나오기도 했고, 답을 잘못 추출하기도 했다.
Balls 와 Share의 범위를 감당하기 위해 BigInteger 형식을 쓰기로 결정했다.
BigInteger Class
: java.math 패키지 안에 있는, long 보다 더 넓은 범위의 정수형을 저장할 수 있는 class
- 문자열 형태로 이루어져 있음
- 더하기(add), 빼기(subtract), 곱하기(multiply), 나누기(divide) 메소드를 이용해 각 인스터스끼리 사칙연산 수행 가능
- 이 외에도 비트 연산, 나머지(remainder), 값 비교(compareTo), 최대(max), 최소(min)을 알 수 있음
수정한 코드
import java.math.BigInteger;
class Solution {
public int solution(int balls, int share) {
if(balls == share) return 1; //얘네 없으면 또 런타임 에러
if(balls < share) return 0; //발생한다
return (factorial(balls).divide(factorial(balls-share).multiply(factorial(share)))).intValue();
}
public BigInteger factorial(int n){
if (n==1) return new BigInteger(Integer.toString(n));
BigInteger result = factorial(n-1).multiply(new BigInteger(Integer.toString(n)));
return result;
}
}
30C30 과 같은 경우에는 30 팩토리얼이 다 수행되는 거여서 그 경우 조건문을 써 주면서 바로 1을 return하게 해야 한다
저 두 줄 써주지 않으면 3개정도 case에서 런타임에러 발생하기 때문에 사전에 방지하기
다른 사람의 풀이
//(1)
class Solution {
public long solution(int balls, int share) {
share = Math.min(balls - share, share);
if (share == 0)
return 1;
long result = solution(balls - 1, share - 1);
result *= balls;
result /= share;
return result;
}
}
짧다. solution 함수를 재귀함수로 사용. 다만 return 타입이 long으로 바꼈다.
//(2)
class Solution {
public long solution(int balls, int share) {
long answer = 0;
int d = (balls - share) > share ? share : balls - share;
if (d == 0) return 1;
return solution(balls - 1, d - 1) * balls / d;
}
}
7C2 와 7C5가 같은 성질을 int d = (balls - share) > share ? share : balls - share; 에서 이용한 코드
프로그래머스 문제들을 풀면서 나는 최대한으로 return type을 바꾸지 않는것이 목표다
그래서 내 BigInteger를 사용한 코드가 복잡하고 길어보이지만 앞으로도 내 코드처럼 문제를 해결하려고 노력할 것이다
이번 기회로 BigInteger 와 사용법도 연습해보고 좋았다~
'Algorithms' 카테고리의 다른 글
Programmers Day 11 (0) | 2023.07.27 |
---|---|
Programmers Day 10 (0) | 2023.07.21 |
Programmers Day 8 (1) | 2023.07.19 |
Programmers Day 7 (0) | 2023.07.18 |
Programmers Day 6 (0) | 2023.07.17 |