프로그래머스_카펫

LeeYulhee·2023년 9월 13일
0

💻 문제 출처 : 프로그래머스_카펫

👉 내가 작성한 답


class Solution {
    public int[] solution(int brown, int yellow) {
        
        int x = 0;
        int y = 0;
        int area = brown + yellow;
        
        for(int i = 1; i <= area / 2; i++) {
            if(area % i == 0) {
                x = i >= area / i ? i : area / i;
                y = i < area / i ? i : area / i;
            }
            
            if((x - 2) * (y - 2) == yellow) break;
        }
        
        return new int[]{x, y};
    }
}
  • 📌 접근 방식
    • 1부터 area / 2 이하까지 하나씩 확인하며 나눠지는 값을 확인
    • 만약 나눠지는 값에서 각각 -2 하고 곱한 값(넓이) 이 yellow랑 같은 걸 찾음
  • 📌 문제 풀이 설명
    • int x, y를 0으로 초기화하고 int area를 brown + yellow로 초기화
    • for문으로 1부터 area / 2 이하까지 1씩 증가하며 순회
      • 만약 area 에서 i를 나눈 나머지가 0인 경우
        • x에 i가 area / i보다 크거나 같으면 i를 아니면 area / i를 대입
        • y에 i와 area / i 중 작은 값을 대입
      • 만약 x - 2와 y - 2를 곱한 값이 yellow와 같다면 break로 for문 종료
    • x와 y를 배열로 만들어 return



👉 다른 사람이 작성한 답 - 1


class Solution {
    public int[] solution(int brown, int yellow) {
        
        int totalCells = brown + yellow;
        
        for (int height = 3; height <= (int)Math.sqrt(totalCells); height++) {
            if (totalCells % height == 0) {
                int width = totalCells / height;

                if (brown == (width * 2) + (height * 2) - 4) {
                    return new int[]{width, height};
                }
            }
        }

        return new int[]{0, 0};
    }
}
  • 📌 문제 풀이 설명
    • int 변수 totalCells에 brown + yellow 대입
    • for문으로 3부터 totalCells의 제곱근 이하까지 1씩 증가하며 순회
      • ➕ height이 3부터 시작하는 이유는 카펫은 중앙에 노란색이 하나 이상 있어야 하고, 테두리인 갈색의 최소 세로 개수는 3개가 됨
      • ➕ totalCells의 제곱근 이하까지 순회하는 이유는 해당 수의 약수 중 가장 큰 수는 제곱근이기 때문
      • 만약 totalCells에서 height를 나눈 나머지가 0인 경우
        • int width에 totalCells / height를 넣음
        • 만약 brown이 width 2와 height 2를 더한 한 값에서 - 4를 뺀 값과 같은 경우
          • ➕ 가로 길이(width)에는 각각 두 줄의 갈색 격자가 있으므로 width 2, 세로 길이(height)에는 각각 두 줄의 갈색 격자가 있으므로 height 2인데 모서리 격자가 중복되므로 - 4
          • width와 height를 배열로 만들어 return
    • 마지막 return은 문제의 조건 상 도달하지 못하는 부분



👉 다른 사람이 작성한 답 - 2


class Solution {
    public int[] solution(int brown, int yellow) {

        for(int i=1; i<=yellow; i++) {
            if(yellow%i==0 && (yellow/i+i)*2+4==brown) {
                return new int[] {yellow/i+2, i+2};
            }
        }
        return null;
    }
}
  • 📌 문제 풀이 설명
    • for문으로 1부터 yellow 이하까지 1씩 증가하며 순회
      • 만약 yellow와 i를 나눈 값의 나머지가 0이고, (yellow/i+i)*2+4가 brown과 같다면
        • ➕ red / i + i는 노란색 부분의 가로와 세로 길이의 합이며, 여기에 2를 곱하고 4를 더하면 전체 갈색 격자의 수가 됨
          • i가 1부터 시작하기 때문에 조건에 해당하면 i가 더 작은 값이라 세로가 됨
          • 그래서 red / i 는 가로가 됨
        • yellow / i 에 + 2한 값과 i + 2한 값을 배열로 만들어 return
          • 모서리 부분 때문에 총 2씩 더해야 테두리가 되기 때문
    • 마지막 return은 문제의 조건 상 도달하지 못하는 부분
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글