| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스 둘만의 암호
- 프로그래머스
- 객체지향
- 입출력
- 다형성
- LocalDate
- 둘만의 암호
- BFS
- 자바의 정석
- SQL Mapper
- 오블완
- 쿠키
- 멀티태스킹
- 리눅스
- 캡슐화
- spring security 설정
- 혼공얄코
- spring security
- localtime
- 둘만의 암호 자바
- over()
- java
- 자바의정석
- IP
- 멀티프로세싱
- 오버로딩
- CPU
- 티스토리챌린지
- hackerrank
- 오버라이딩
- Today
- Total
쉽게 쉽게
[프로그래머스] 택배 상자 꺼내기 -Java 본문
▤ 목차
1. 문제설명
https://school.programmers.co.kr/learn/courses/30/lessons/389478
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1 ~ n의 번호가 있는 택배 상자가 창고에 있습니다. 당신은 택배 상자들을 다음과 같이 정리했습니다.
왼쪽에서 오른쪽으로 가면서 1번 상자부터 번호 순서대로 택배 상자를 한 개씩 놓습니다. 가로로 택배 상자를 w개 놓았다면 이번에는 오른쪽에서 왼쪽으로 가면서 그 위층에 택배 상자를 한 개씩 놓습니다. 그 층에 상자를 w개 놓아 가장 왼쪽으로 돌아왔다면 또다시 왼쪽에서 오른쪽으로 가면서 그 위층에 상자를 놓습니다. 이러한 방식으로 n개의 택배 상자를 모두 놓을 때까지 한 층에 w개씩 상자를 쌓습니다.

위 그림은 w = 6일 때 택배 상자 22개를 쌓은 예시입니다.
다음 날 손님은 자신의 택배를 찾으러 창고에 왔습니다. 당신은 손님이 자신의 택배 상자 번호를 말하면 해당 택배 상자를 꺼내줍니다. 택배 상자 A를 꺼내려면 먼저 A 위에 있는 다른 모든 상자를 꺼내야 A를 꺼낼 수 있습니다. 예를 들어, 위 그림에서 8번 상자를 꺼내려면 먼저 20번, 17번 상자를 꺼내야 합니다.
당신은 꺼내려는 상자 번호가 주어졌을 때, 꺼내려는 상자를 포함해 총 몇 개의 택배 상자를 꺼내야 하는지 알고 싶습니다.
창고에 있는 택배 상자의 개수를 나타내는 정수 n, 가로로 놓는 상자의 개수를 나타내는 정수 w와 꺼내려는 택배 상자의 번호를 나타내는 정수 num이 매개변수로 주어집니다. 이때, 꺼내야 하는 상자의 총개수를 return 하도록 solution 함수를 완성해 주세요.
제한사항
2 ≤ n ≤ 100
1 ≤ w ≤ 10
1 ≤ num ≤ n
입출력 예
| n | w | num | result |
| 22 | 6 | 8 | 3 |
| 13 | 3 | 6 | 4 |
입출력 예 설명
입출력 예 #1
문제 예시와 같습니다. 꺼내야 하는 상자의 총개수는 8번 상자를 포함해 3개입니다.
입출력 예 #2

6번 상자를 꺼내려면 먼저 13, 12, 7번 상자를 꺼내야 합니다.
따라서 4를 return 합니다.
2. 문제풀이
나의 풀이
class Solution {
public int solution(int n, int w, int num) {
int answer = 0;
int number = 1; //이중배열 값
int h = (n + w - 1) / w; //높이
int[][] all = new int[h][w];
for(int i=0; i<h; i++){
if(i % 2 == 0){ //홀수칸
for(int j=0; j<w; j++){
all[i][j] = number++;
}
}else { //짝수칸
for (int j = w - 1; j >= 0; j--) {
all[i][j] = number++;
}
}
}
// 잘 입력됐는지 확인해보기
// for (int i = 0; i < all.length; i++) {
// for (int j = 0; j < all[i].length; j++) {
// System.out.printf("%3d ", all[i][j]);
// }
// System.out.println();
// }
int row = 0;
int col = 0;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
if(all[i][j] == num){//해당 박스 위치
col = i;
row = j;
break;
}
}
}
//해당 박스 위에있는 박스 카운트
for(int z =col; z<h; z++){
if(all[z][row] <= n){
answer++;
}
}
return answer;
}
}
다른 사람 풀이
import java.util.*;
class Solution {
public int solution(int n, int w, int num) {
// 문제풀이
int cnt = 0;
while(num <= n) {
num += (w - ((num-1) % w) -1) * 2 + 1;
cnt++;
}
// 반환
int answer = cnt;
return answer;
}
}
이런 수학적 사고는 어떻게 하는건지 참 놀랍다...
| 잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |

'문제풀이 > 프로그래머스' 카테고리의 다른 글
| [프로그래머스] 다음 큰 숫자 -Java (0) | 2025.11.01 |
|---|---|
| [프로그래머스] 가장 많이 받은 선물 -Java (0) | 2025.10.20 |
| [프로그래머스] 동영상 재생기 - Java (0) | 2025.10.13 |
| [프로그래머스] 둘만의 암호 - Java (1) | 2025.08.12 |
| [프로그래머스] 문자열 나누기 - Java (0) | 2025.08.12 |
