1 ~ n의 번호가 있는 택배 상자가 창고에 있습니다. 당신은 택배 상자들을 다음과 같이 정리했습니다.
왼쪽에서 오른쪽으로 가면서 1번 상자부터 번호 순서대로 택배 상자를 한 개씩 놓습니다. 가로로 택배 상자를 w개 놓았다면 이번에는 오른쪽에서 왼쪽으로 가면서 그 위층에 택배 상자를 한 개씩 놓습니다. 그 층에 상자를 w개 놓아 가장 왼쪽으로 돌아왔다면 또다시 왼쪽에서 오른쪽으로 가면서 그 위층에 상자를 놓습니다. 이러한 방식으로 n개의 택배 상자를 모두 놓을 때까지 한 층에 w개씩 상자를 쌓습니다.
다음 날 손님은 자신의 택배를 찾으러 창고에 왔습니다. 당신은 손님이 자신의 택배 상자 번호를 말하면 해당 택배 상자를 꺼내줍니다. 택배 상자 A를 꺼내려면 먼저 A 위에 있는 다른 모든 상자를 꺼내야 A를 꺼낼 수 있습니다. 예를 들어, 위 그림에서 8번 상자를 꺼내려면 먼저 20번, 17번 상자를 꺼내야 합니다.
당신은 꺼내려는 상자 번호가 주어졌을 때, 꺼내려는 상자를 포함해 총 몇 개의 택배 상자를 꺼내야 하는지 알고 싶습니다.
창고에 있는 택배 상자의 개수를 나타내는 정수 n, 가로로 놓는 상자의 개수를 나타내는 정수 w와 꺼내려는 택배 상자의 번호를 나타내는 정수 num이 매개변수로 주어집니다. 이때, 꺼내야 하는 상자의 총개수를 return 하도록 solution 함수를 완성해 주세요.
class Solution {
public int solution(int n, int w, int num) {
int total_line = n / w; // 총 line
int left_box = n % w; // 남은 박스
int target_line = 1;
int target_box = 0;
int answer = 0;
if (w < num) {
if ((num % w) == 0) {
target_line = num / w;
} else {
target_line = (num / w) + 1;
}
}
if (target_line % 2 == 0) {
// 짝수일 경우
target_box = (w * target_line) - num + 1;
} else if (target_line == 1) {
target_box = w;
} else {
// 홀수일 경우
target_box = num % w;
}
if (left_box != 0) {
if ((total_line+1) % 2 == 0) {
// 남은 박스가 있는 라인이 짝수 라인이라면
for (int i= w; i> (w -left_box); i--) {
if ( i == target_box) {
answer++;
}
}
} else {
if (left_box >= target_box) {
answer++;
}
}
}
answer += total_line - target_line + 1;
return answer;
}
}
내가 풀은 식은 이거지만...
30.0/100.0 맞았음.
박스의 위치를 지그재그 수 세기를 제대로 못한 것 같음
정답
class Solution {
public int solution(int n, int w, int num) {
int total_line = n / w; // 총 line
int left_box = n % w; // 남은 박스
int target_line = 1;
int target_box = 0;
int answer = 0;
if (w < num) {
if ((num % w) == 0) {
target_line = num / w;
} else {
target_line = (num / w) + 1;
}
}
if (target_line % 2 == 0) {
// 짝수일 경우
int idxInRow = (num - 1) % w;
target_box = w - idxInRow;
} else {
// 홀수일 경우
target_box = (num - 1) % w + 1;
}
if (left_box != 0) {
if ((total_line+1) % 2 == 0) {
// 남은 박스가 있는 라인이 짝수 라인이라면
for (int i= w; i> (w -left_box); i--) {
if ( i == target_box) {
answer++;
}
}
} else {
if (left_box >= target_box) {
answer++;
}
}
}
answer += total_line - target_line + 1;
return answer;
}
}
정답은 이거입니다
더 시간을 갖고 생각해봐도 도출될 답이 아닌 걸 알기 때문에 아쉽진 않지만,
저런 방식을 생각하지 못하여 좀 한심하긴 하다.
그리고 위층 상자 남은 상자 등 줄 위치를 자꾸 혼동을 주는 코드라고 하는데,
내 생각 알고리즘 문제이지 않을까 싶다.
'프로그래머스' 카테고리의 다른 글
| [프로그래머스] 서버 증설 횟수 (5) | 2025.07.25 |
|---|---|
| [프로그래머스] 유연근무제 (1) | 2025.07.21 |
| [프로그래머스] 특정 형질을 가지는 대장균 찾기 (0) | 2025.07.17 |