programmers Day22

Hwani·2024년 5월 29일

프로그래머스 DAY 1~25

목록 보기
22/51
post-thumbnail

문제 - 저주의 숫자 3

풀이

class Solution {
    public int solution(int n) {
        int answer = 0;
        
        // 매개변수로 들어온 n까지 for문을 돌림
        for (int i = 0; i < n; i++) {       
            answer++;
            // 3의 배수거나 "3"을 포함하고 있으면
            while (answer % 3 == 0 || String.valueOf(answer).contains("3")) { 
                answer++; // answer에 더해주고 리턴한다.
            }
        }
        
        return answer;
    }
}

설명

  • for문으로 n까지 루프를 돌린다.
  • while문으로 3의 배수이거나 3을 포함한다면 answer를 증가시킨 후 리턴한다.

문제 - 평행

풀이

class Solution {
    public int solution(int[][] dots) {
	    // 점의 좌표를 변수에 저장
        int x1 = dots[0][0];
        int y1 = dots[0][1];
        int x2 = dots[1][0];
        int y2 = dots[1][1];
        int x3 = dots[2][0];
        int y3 = dots[2][1];
        int x4 = dots[3][0];
        int y4 = dots[3][1];
        int answer = 0;
        
        // 나올 수 있는 두 쌍의 조합을 계산한다.
        double slope1 = (double) (y2 - y1) / (x2 - x1);
        double slope2 = (double) (y4 - y3) / (x4 - x3);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y3 - y1) / (x3 - x1);
        slope2 = (double) (y2 - y4) / (x2 - x4);
        if (slope1 == slope2) answer = 1;
        
        slope1 = (double) (y4 - y1) / (x4 - x1);
        slope2 = (double) (y2 - y3) / (x2 - x3);
        if (slope1 == slope2) answer = 1;
        
        return answer;
    }
}

설명

이 문제를 푸는데는 오래 걸렸고 이차원 배열이 어렵고 그렇게 좋은 코드도 아닌것같다..

  • 각각 좌표를 변수에 저장한다.
  • 나올 수 있는 두 쌍의 조합을 모두 계산해서 리턴한다.

문제 - 겹치는 선분의 길이

풀이

class Solution {
    public int solution(int[][] lines) {
	    // -100부터 100까지의 범위를 커버하기 위해 201 크기의 배열 사용
        int[] arr = new int[201]; 

        for (int i = 0; i < lines.length; i++) {
            for (int j = i + 1; j < lines.length; j++) {
                int start1 = lines[i][0];
                int end1 = lines[i][1];
                int start2 = lines[j][0];
                int end2 = lines[j][1];

                // 겹치는 부분을 찾기 위한 시작과 끝 계산
                int overlapStart = Math.max(start1, start2);
                int overlapEnd = Math.min(end1, end2);

                // 겹치는 부분이 있는 경우 arr 배열에 표시
                if (overlapStart < overlapEnd) {
                    for (int k = overlapStart; k < overlapEnd; k++) {
	                    // 인덱스 보정: -100을 0으로 맞추기 위해 100을 더함
                        arr[k + 100] = 1; 
                    }
                }
            }
        }

        // 겹치는 부분의 길이를 계산
        int answer = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == 1) {
                answer++;
            }
        }

        return answer;
    
    }
}

설명

  • 문제에서 -100 부터 100 까지 조건이 있어서 201 크기의 배열을 생성한다.
  • i열과 j열의 겹치는 부분을 계산한다.
  • 계산한 값을 배열에 추가한다. -값 일 수도 있으니 +100을 해준다.

문제 - 유한소수 판별하기

풀이

import java.util.*;

class Solution {
    public int solution(int a, int b) {
        int finalB = b / GCD(a, b);
        
        while(finalB != 1) {
            if(finalB % 2 == 0) {
                finalB /= 2;
            }else if (finalB % 5 == 0) {
                finalB /= 5;
            }else {
                return 2;
            }
        }
        
        return 1;
    }
    // 유클리드 호제법 - 두 수의 최대 공약수 구하기
    private int GCD(int a, int b) {
        if (b == 0) {
            return a;
        } else {
            return GCD(b, a % b);
        }
    }
}

설명

이 문제는 유킬리드 호제법으로 최대공약수를 구해서 푸는 문제이다.

  • finalB != 1 1이 아니라면 2 또는 5로 이루어져있다는 뜻이니까 조건을 설정한다.
  • 2 또는 5로 나머지가 0 이라면 return 1, 아니라면 return 2를 한다.
profile
개발자될거야

0개의 댓글