https://www.acmicpc.net/workbook/view/4380
원하는 초콜릿의 개수를 0으로 만들어 가는 과정이라고 생각해야 한다.
열심히 구현했는데 시간 초과가 났다.
케이스는 나누거나 빼는 것, 둘 중에 하나다.
정답
while(n<k) n= n*2;
StringBuilder sb= new StringBuilder();
sb.append(n).append(" ");
while(k>0){ //원하는 초코값이 0보다 클 동안
if(k>=n){ // 원하는 초코값이 구매한 초코값보다 크면 => 원한 초코 - 구한 초코
k-=n; // 6-4= 2 => 2개의 초코가 더 필요함.
// System.out.println(k);
}else{
n/=2; // 구한 초코 / 2
count++; // 컷팅 횟수 추가
// System.out.println("나누기" + n); // 그래서 나눔
}
}
나의 오답
long half = choco/2;
long sum = half;
cutCnt++;
while(half > 0) {
if(sum == wChoco) break;
if(sum < wChoco) { // 4< 6
half = (int)half/2; // 2가 나옴
sum = sum + half; // 4+2 = 6
cutCnt++;
}
}
이건 약간 dp인가? 생각도 들었고, 풀이가 적었는데 그 중에 하나 보니까
12110
##*##
여기서 ##*##
는 걍 br.readLine()
만 하고 딱히 저 *
의 위치는 의미가 없었다;;
br.readLine()을 해야 입력 줄수가 맞아서 예의상 하는 느낌;;
첫째 자리, 마지막 자리, 그 외, 총 3개의 케이스로 해서 0이 아니면 -1을 한다.
그러다 보면 답이 나오는 게 신기했음
int result = 0;
for (int j = 0; j < num; j++) {
if (j == 0) {
if (numArr[j] != 0 && numArr[j + 1] != 0) {
numArr[j]--;
numArr[j + 1]--;
result++;
}
} else if (j == num - 1) {
if (numArr[j - 1] != 0 && numArr[j] != 0) {
numArr[j]--;
numArr[j - 1]--;
result++;
}
} else {
if (numArr[j - 1] != 0 && numArr[j] != 0 && numArr[j + 1] != 0) {
numArr[j - 1]--;
numArr[j]--;
numArr[j + 1]--;
result++;
}
}
}