728x90
🔗 문제 링크
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 문제 개요
창고에 택배 상자를 지그재그(좌→우, 우→좌 반복) 형태로 쌓는다.
꺼내려는 상자가 주어졌을 때 해당 상자를 포함하여 총 몇 개의 상자를 꺼내야 하는지 구하는 문제이다.
예를 들어 같은 열에 위쪽에 있는 상자가 있다면 그 상자부터 먼저 꺼내야 한다.
📌 접근 방법
이 문제의 핵심은 상자의 번호를 2차원 좌표(row, column)로 변환하는 것이다.
- 상자의 행(row)과 열(column)을 계산한다.
- 홀수 행은 역방향으로 배치되므로 실제 열 위치를 변환한다.
- 현재 상자와 같은 열에 있는 위쪽 상자들을 찾는다.
- 마지막 행은 상자가 부족할 수 있으므로 실제 존재하는 상자인지 확인한다.
- 현재 상자를 포함한 개수를 반환한다.
📌 핵심 아이디어
1. 행과 열 계산
상자의 위치를 2차원 좌표로 변환한다.
int row = (num - 1) / w;
int col = (num - 1) % w;
2. 지그재그 방향 처리
짝수 행은 그대로 사용한다.
1 2 3 4
홀수 행은 반대로 배치된다.
8 7 6 5
따라서 실제 열을 맞춰준다.
if(row % 2 == 1){
col = w - 1 - col;
}
3. 같은 열만 확인
현재 상자를 막는 것은 같은 열에 있는 상자뿐이다.
위쪽 행을 하나씩 검사하면서 해당 위치에 상자가 존재하면 개수를 증가시킨다.
4. 마지막 행 예외 처리
마지막 행은 항상 가득 차는 것이 아니다.
따라서 계산한 번호가 n을 초과하는지 확인해야 한다.
📌 전체 코드
class Solution {
public int solution(int n, int w, int num) {
int row = (num - 1) / w;
int col = (num - 1) % w;
// 현재 상자의 실제 열 위치
if (row % 2 == 1) {
col = w - 1 - col;
}
int answer = 1; // 현재 상자 포함
int lastRow = (n - 1) / w;
// 현재 상자 위의 행만 확인
for (int r = row + 1; r <= lastRow; r++) {
int box;
if (r % 2 == 0) {
box = r * w + col + 1;
} else {
box = r * w + (w - col);
}
if (box <= n) {
answer++;
}
}
return answer;
}
}
📄 정리
- 상자 번호를 좌표(row, column)로 변환하는 것이 핵심이다.
- 홀수 행은 역방향 배치이므로 열 위치를 반대로 계산해야 한다.
- 현재 상자를 막는 것은 같은 열의 상자뿐이다.
- 마지막 행이 비어 있을 수 있으므로 존재 여부를 반드시 확인해야 한다.
- 구현 자체는 어렵지 않지만 좌표 변환과 예외 처리가 핵심인 구현 문제였다.
728x90
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
| 프로그래머스 문자열안에 문자열 JAVA 풀이 (Level 0) (0) | 2026.07.09 |
|---|---|
| 프로그래머스 크레인 인형뽑기 게임 JAVA 풀이 (2019 카카오 개발자 겨울 인턴십) (0) | 2026.07.08 |
| 프로그래머스 문자열 안의 숫자 더하기 JAVA 풀이 (문자열, 구현, 아스키코드) (0) | 2026.07.05 |
| 프로그래머스 다트 게임 JAVA 풀이 (0) | 2026.07.04 |
| 프로그래머스 PCCE 기출문제 10번 데이터 분석 JAVA 풀이 (구현, 정렬) (0) | 2026.07.03 |