본문 바로가기

취업/코딩테스트

프로그래머스 택배 상자 꺼내기

문제

 

 

정답

총 층수와 해당하는 num의 층수를 구해서 빼면 구할 수 있을 것이라 생각했다.

맨 위층이 다 채워진 경우와 다 채워지지 않는 경우로 나누고,

다 채워지지 않은 경우 num이 해당하는 층이 정방향인지 역방향인지 고려하여 에서 어느 위치에 있는지 1부터 w까지 구했다. 역방향의 경우 w를 빼주어 정방향의 위치로 고쳐주었다.

맨 위층의 방향도 고려하여 어디까지 상자가 채워져 있고 이를 num의 위치와 비교하여 상자의 개수를 구했다.

class Solution {
    public int solution(int n, int w, int num) {
        int answer = 0;
        int numh = 0;
        int numloc = 0;

        // 총 층수 구하기
        if(n%w == 0) {answer=n/w;}
        else {answer=n/w +1;}

        // 주어진 num의 층수 구하기
        if(num%w==0) {numh=num/w;} // w의 배수일 때는 몫이 하나 크게 나오므로 1을 더하지 않는다.
        else {numh=num/w+1;} // 1층부터 사용하므로 1을 더한다.

        // 가장 꼭대기 층에 상자가 더 쌓여 있는지 확인
        if(n%w != 0) {
            // 홀수층 방향이 정방향, num 위치 구하기
            if(numh%2!=0) {
                if(num%w==0) {numloc = num%w + w;}
                else {numloc = num%w;}
            }
            // 짝수층 방향이 역방향, num 반대로 바꾸고 위치 구하기
            else {
                if(num%w==0) {numloc = w - (num%w + w) +1;}
                else {numloc = w - (num%w) +1;}
            }

            // num의 위치 맨 위에 상자가 있는지 확인
            if(answer%2!=0) { // 맨 위가 홀수층(정방향)일 경우
                if(n%w >= numloc) {answer = answer-numh+1;} // 맨 위의 상자의 숫자보다 num의 위치가 작거나 같을 경우 하나를 더한다.
                else {answer = answer-numh;}
            }
            else { // 맨 위가 짝수층(역방향)일 경우
                if((w-(n%w)) < numloc) {answer = answer-numh+1;} // 비어있는 공간보다 num의 위치가 큰 경우 하나를 더한다.
                else {answer = answer-numh;}
            }
        }
        else {answer = answer-numh;} // 배수면 바로 빼주기만 한다.
        
        return answer;
    }
}

70 정확도로 테스트 1~10만 계속 실패했다.

 

코드를 주석처리하며 결과를 확인했으나 잘 되지 않아서 테스트 케이스로 여러 경우를 추가해보았다.

n=20, w=4, num=18, 예상 결과값이 1인 테스트 케이스에서 걸렸다. 맨 위층의 상자를 꺼낼경우 전체 높이에서 해당 상자의 높이를 빼기에 0이 나와 생기는 오류였다.

 

해당 케이스에 1을 더해주니 테스트를 통과하였다.

 

최종 제출한 정답

class Solution {
    public int solution(int n, int w, int num) {
        int answer = 0;
        int numh = 0;
        int numloc = 0;

        // 총 층수 구하기
        if(n%w == 0) {answer=n/w;}
        else {answer=n/w +1;}

        // 주어진 num의 층수 구하기
        if(num%w!=0) {numh=num/w+1;} // w의 배수일 때는 몫이 하나 크게 나오므로 1을 더하지 않는다.
        else {numh=num/w;} // 1층부터 사용하므로 1을 더한다.

        // 가장 꼭대기 층에 상자가 더 쌓여 있는지 확인
        if(n%w != 0) {
            // 홀수층 방향이 정방향, num 위치 구하기
            if(numh%2!=0) {
                if(num%w==0) {numloc = num%w + w;}
                else {numloc = num%w;}
            }
            // 짝수층 방향이 역방향, num 반대로 바꾸고 위치 구하기
            else {
                if(num%w==0) {numloc = w - (num%w + w) +1;}
                else {numloc = w - (num%w) +1;}
            }

            // num의 위치 맨 위에 상자가 있는지 확인
            if(answer%2!=0) { // 맨 위가 홀수층(정방향)일 경우
                if(n%w >= numloc) {answer = answer-numh+1;} // 맨 위의 상자의 숫자보다 num의 위치가 작거나 같을 경우 하나를 더한다.
                else {answer = answer-numh;}
            }
            else { // 맨 위가 짝수층(역방향)일 경우
                if((w-(n%w)) < numloc) {answer = answer-numh+1;} // 비어있는 공간보다 num의 위치가 큰 경우 하나를 더한다.
                else {answer = answer-numh;}
            }
        }
        else {answer = answer-numh+1;} // 배수면 바로 빼주기만 한다.
        
        return answer;
    }
}