소요시간 : 3시간
경로 : https://school.programmers.co.kr/learn/courses/30/lessons/389478
두 가지 문제 풀이가 생각났습니다
1번 숫자가 크지 않으니 하나씩 다 적재해서 구현
2번 좌표를 계산해 수학적으로 접근
2번을 시도하다가 반례 문제를 찾지 못해서 1번으로 선회했습니다
2번에서 2시간 30분정도가 걸렸고 1번으로 접근하니 30분만에 해결했습니다
로직
1번 해당 사진을 보고 직접 상자를 다 적재하는 코드를 구현
2번 적재 중 타겟이 되는 상자 숫자가 있으면 좌표를 기억
3번 적재가 모두 완료되면 하나씩 꺼내면서 값을 구하기
직접 적재하는 코드를 손 코딩으로 먼저 설계한 후에 코딩을 했습니다.
구현에 실패했던 손 코딩 흔적 입니다.
package Question;
import java.util.Arrays;
public class TakeOutTheDeliveryBox2 {
public static void main(String[] args) {
System.out.println(solution(100,1,33));
}
public static int solution(int n, int w, int num) {
int answer = 0; // 자기 자신 상자를 포함하니 1
int boxNumber = n;
int box = 1;
int h = n/w;
if(n%w > 0) h++;
// 0은 빈공간을 의미
int wPoint = 0;
int hPoint = 0;
// 적재할 공간
int[][] boxSpace = new int[h][w];
boolean reverseLoad = false;
for(int i = 0; i < h; i++){
int startPoint = reverseLoad ? w-1 : 0;
for (int j = 0; j < w; j++) {
if(boxNumber > 0){
boxSpace[(h-1)-i][startPoint] = box;
if(box == num){
wPoint = startPoint;
hPoint = (h-1)-i;
}
if(reverseLoad) startPoint--;
else startPoint++;
box++;
boxNumber--;
}
}
reverseLoad = !reverseLoad;
}
//System.out.println(Arrays.deepToString(boxSpace));
// 위치를 찾았으니 적재위치에서 위로 하나씩 체크
for (int i = hPoint; i >= 0 ; i--){
if(boxSpace[i][wPoint] == 0){
break;
}else{
answer++;
}
}
return answer;
}
}
정답코드를 보기 불편하다면 github를 참고해주세요
https://github.com/ddpound/DoItAlgorithm/blob/master/src/Question/TakeOutTheDeliveryBox2.java