프로그래머스 1단계

프로그래머스 [택배 기사]

dev-lee 2026. 2. 28. 11:26

이번 문제는 풀기 전에 미리 구상하는 것이 중요하다는 걸 다시 느끼게 해줬다.

막무가내로 풀었으면 조건문을 많이 쓸 수도 있었을 텐데 미리 로직을 짜고 코딩을 시작하니 간단하게 풀 수 있었다.

class Solution {
    public int solution(int n, int w, int num) {
        //배열과 같은 인덱스로 맞추기 위해 -1씩 해준다.
        num--;
        n--;
        
        // row는 행, col은 열을 의미함. 아래 세줄은 꺼내야하는 상자의 행과 열을 구함.
        int row = num/w;
        int loc = num%w;
        int col = row%2 == 1 ? w-loc-1 : loc;
        
        // 아래 세줄은 마지막 상자의 행과 열을 구함.
		int lastRow = n/w;
		int lastLoc = n%w;
		int lastCol = lastRow%2 == 1 ? w-lastLoc-1 : lastLoc;
        
        // 마지막 행은 고려하지 않고 확정으로 꺼내야하는 박스의 수를 구함.
		int boxes = lastRow - row;
        
        
        //마지막상자의 열과 꺼내야하는상자의 열이 같으면 무조건 한 개 더 꺼내야함.
		if(col == lastCol) {
			boxes++;
		} else {

            //꺼내야하는상자와 마지막상자의 위치를 비교하고 마지막열은 왼쪽부터 채워지는지 오른쪽부터 채워지는지 계산함.
			int isLeft = col < lastCol ? 1 : 0;
			int fillLeft =  lastRow%2 == 1 ? 0 : 1;

            //둘 다 왼쪽이면 박스가 하나 더 쌓일테고 오른쪽도 마찬가지임.
			if(isLeft == 1 && fillLeft == 1) boxes++;
			if(isLeft == 0 && fillLeft == 0) boxes++;

		}
        return boxes;
    }
}