

내가 작성한 코드
public 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 count = 0; // 뺄 상자 수
int maxRow = (n + w - 1) / w; // 총 층 수
// 찾는 상자의 층수 + 1 부터 최대 층 수까지
for (int i = row + 1; i < maxRow; i++) {
int targetCol = (i % 2 == 0) ? col : w - 1 - col; // 행이 홀수이면 열순서 뒤집기
int boxNum = i * w + targetCol + 1; // 찾는 상자 위의 있는 상자
// 그 상자가 존재하는지 확인
if (boxNum <= n) {
count++; // 유효한 상자면 하나 추가
}
}
return count + 1; // 본인 포함 시키기
}
}
다른 사람의 코드
class Solution {
/*
Programmers. 택배 상자 꺼내기
---------------------------
[문제 설명]
택배 상자
- 1~N
택배 쌓기
- 왼쪽에서 오른쪽으로 w개 쌓기
- 그 위에 오른쪽에서 왼쪽으로 w개 쌓기
- 반복
택배 꺼내기
- 입력된 상자번호(A)를 꺼내기
- 그 위에 쌓인 모든 상자부터 꺼내야 함
[입력]
N : 창고에 있는 택배 상자의 수
W : 가로로 놓는 상자 수
num : 꺼내려는 상자 번호
[출력]
꺼래려는 상자를 포함해서 총 꺼내야하는 상자의 수
[제한사항]
2 <= N <= 100
1 <= W <= 10
1 <= num <= N
*/
public int solution(int n, int w, int num) {
int cnt = 0; // 꺼내야 하는 상자 개수를 세는 변수 (자기 자신 포함)
// num이 전체 상자 수 n보다 작거나 같은 동안 반복
while (num <= n) {
// 위 층에서 같은 열에 해당하는 다음 상자의 번호를 계산하는 공식
// ((num-1) % w): 현재 상자의 열 위치 (왼쪽부터 0 시작)
// w - ((num-1) % w) - 1: 그 열의 반대편 열까지의 거리
// * 2 + 1: 지그재그 구조로 인해 다음에 같은 열에 오는 상자까지의 간격
num += (w - ((num - 1) % w) - 1) * 2 + 1;
cnt++; // 상자 하나 꺼냄 (자기 자신 포함)
}
// 위에 있는 상자들 + 본인 포함한 개수 반환
int answer = cnt;
return answer;
}
}
Share article