- 프로래머스 Lv1 택배 상자 꺼내기 문제
- 해당 문제의 난이도 상승 원인
- 해당 문제를 해결한 방법
- 박스들의 최대 x, y 좌표를 구한 후, 특정 박스를 골랐을 때 그 박스가 소속된 x, y 좌표를 구하고 그 좌표 부분의 최상단을 확인하여 최상단에 박스가 있는지 없는지 검사
- 처음 방식에서 변경한 방식
- 처음
- 짝수층의 좌표를 - 로 두어서 검사하려고 하였으나 오히려 더 복잡해지는 상황 발생
- 변경
- 전체 좌표를 미리 구하지 않고 최대 x, y 만 구한 후, 박스가 특정되었을 때 그 박스의 좌표와 최상단 만을 검사하도록 함
- 문제의 핵심
- 최상단 박스가 한 층을 온전히 이루는지 아니면 일부만 이룰 때 처리법
- 이 문제의 목적
- 문제에 '좌표'를 사용하게 끔 유도를 하지만, 실제로는 그러지 않아도 된다는 것을 학습
- 문제 속에 함정을 파 놓아도 이에 걸리지 않고 방법을 찾을 수 있다는 방법을 알려줌
class TakeOutBox {
public int solution(int n, int w, int num) {
int answer = 0;
int total_row = ((n + w - 1) / w) - 1; // 최상단의 row 좌표 구함
int num_row = (num - 1) / w; // 목표의 row 좌표(개수) 구함
int num_col = (num - 1) % w; // 목표의 col 좌표(개수) 구함
// 정방향, 순방향 조정
num_col = (num_row % 2 == 0) ? num_col : (w - 1) - num_col;
for(int r=num_row; r<=total_row; r++){
int boxCnt = Math.min(w, n - r * w);
int lastRowCol = (r % 2 == 0) ? boxCnt - 1 : w - boxCnt;
if(r % 2 == 0){
if(lastRowCol >= num_col) answer++;
}else {
if(lastRowCol <= num_col) answer++;
}
}
return answer;
}
public static void main(String[] args) {
int n = 22;
int w = 6;
int num = 8;
TakeOutBox tob = new TakeOutBox();
System.out.println("결과 : " + tob.solution(n, w, num));
}
}