Red Glitter Pointer

 

 

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int[] dwarf = new int[9];
        int sum = 0;

        for(int i = 0; i < 9; i++) {
            dwarf[i] = Integer.parseInt(br.readLine());
            sum += dwarf[i];
        }
        int num = sum; // for문 돌리면서 sum값을 초기화 시키기 위해 num 변수 선언

        outer:
        for(int i = 0; i < 8; i++) {
            for(int j = i + 1; j < 9; j++) {
                sum -= (dwarf[i] + dwarf[j]); // 9명에서 2명을 빼서 7명 키의 합을 구한다
                if(sum == 100) { // 100이 된다면 i와 j 난쟁이를 없애기
                    dwarf[i] = 0;
                    dwarf[j] = 0;
                    break outer;
                }
                sum = num; // sum값 초기화
            }
        }
        Arrays.sort(dwarf); // 오름차순 정렬
        StringBuilder sb = new StringBuilder();
        for(int i = 2; i < 9; i++) { // 0번, 1번 인덱스는 0일테니(없앤 난쟁이 자리) 2번부터 출력
            sb.append(dwarf[i]).append("\n");
        }
        System.out.println(sb);
    }
}

 

 

 

👇 제출한 코드

느낀 점 및 정리 ✍️

1. 처음에는 7명을 구하려고 하다가 메모리 초과가 났다. 그래서 주어지는 9명과 뽑아야하는 7명의 숫자는 고정되어있으니 2명만 찾아서 빼는 방식으로 구현하였다. 

2. 2중 for문을 돌리면서 i번째, j번째에 있는 난쟁이들을 없애보며 키의 합이 100이 될 때를 찾아냈다

 

 

 

 

 

 

3649번: 로봇 프로젝트

각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에

www.acmicpc.net

 

 

 

👇 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public String solution(int x, int n, int[] arr) {
        String answer = "danger";
        Arrays.sort(arr); // 투포인터 알고리즘을 사용하기 위해 정렬
        int lt = 0; // 왼쪽 포인터
        int rt = n - 1; // 오른쪽 포인터

        while(lt < rt) { // 왼쪽 포인터가 오른쪽 포인터보다 작을 때만 작동
            int sum = arr[lt] + arr[rt];

            // 더한 값이 찾으려는 x의 값과 일치하다면 yes 리턴,
            // 더한 값이 x보다 크다면 오른쪽 포인터(더 큰 수) 감소, x보다 작다면 왼쪽 포인터 증가(수 증가시키기)
            if(sum == x) return "yes " + arr[lt] + " " + arr[rt];
            else if(sum > x) rt--;
            else lt++;
        }

        return answer;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = null;

        while ((str = br.readLine()) != null) { // 테스트 케이스의 수를 따로 주지 않음
            int x = Integer.parseInt(str);
            int n = Integer.parseInt(br.readLine());

            int[] arr = new int[n];
            for (int i = 0; i < n; i++) arr[i] = Integer.parseInt(br.readLine());

            Main T = new Main();
            System.out.println(T.solution(x * 10000000, n, arr)); // 나노미터
        }
    }
}

 

 

느낀 점 및 정리 ✍️

1. 최근 풀었던 문제 중에 제일 !!!! 허탈했다 ㅜ 문제 읽자마자 [두 개의 숫자 + 정답이 여러 개일 경우 차이가 더 큰 값] 조건을 보고 투포인터 쓰면 바로 풀리겠다 싶어서 빠르게 로직 구현했는데, 25%에서 틀렸다는 문구가 계속 나와서 테스트 케이스 여러 개 만들어서 해보는데도 틀린 부분이 보이지 않았다 ㅠ 그러다가 발견한 "입력은 여러개의 테스트 케이스로 이루어져 있다" ...............ㅋㅎㅋㅎ ㅋ후쿠 ㅜㅜㅠㅠ 나는 왜 당연하게 1개의 테스트 케이스만 입력될 수 있게 구현했는가,,,,, ㅠ 풀이 시간은 5분? 밖에 안걸렸는데 이것 때문에 디버깅 시간이 ☠️☠️☠️☠️

2. 진~~~~~~~~~~~~~~짜 입출력 조건 + 문제 조건 🌟 무조건. 재확인 🌟 하고 따로 적어둔 다음에 설계 시작해야겠다 ㅜㅠ 

 

 

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

 

👇 제출한 코드

 

SELECT ROUTE
    , CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE
    , CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY ROUND(SUM(D_BETWEEN_DIST), 1) DESC


-- 기존 작성했던 코드는 아래와 같다.
SELECT ROUTE
    , CONCAT(ROUND(SUM(D_BETWEEN_DIST), 1), 'km') AS TOTAL_DISTANCE
    , CONCAT(ROUND(AVG(D_BETWEEN_DIST), 2), 'km') AS AVERAGE_DISTANCE
FROM SUBWAY_DISTANCE
GROUP BY ROUTE
ORDER BY TOTAL_DISTANCE DESC

 

느낀 점 및 정리 ✍️

1. 기존 작성했던 코드는 아래에 ORDER BY TOTAL_DISTANCE DESC 인데, 제출하면 계속 틀렸다고 나와서 뭐때문인지 알 수가 없었다 .. . 검색해보니 CONCAT을 사용해서 문자열을 붙여주면, 정렬 시 제대로 정렬이 안된다고 한다 ㅠ 

 

 

 

 

 

2343번: 기타 레슨

강토는 자신의 기타 강의 동영상을 블루레이로 만들어 판매하려고 한다. 블루레이에는 총 N개의 강의가 들어가는데, 블루레이를 녹화할 때, 강의의 순서가 바뀌면 안 된다. 순서가 뒤바뀌는 경

www.acmicpc.net

 

 

 

👇 작성한 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    public int count(int[] arr, int possible) {
        int cnt = 1, sum = 0;
        // 배열을 돌면서 mid값을 초과하지 않을 정도로 sum에 숫자를 더해준다.
        for(int x : arr) {
            if(sum + x > possible) { // mid 값을 초과한다면, 블루레이 개수 추가
                cnt++;
                sum = x; // 블루레이에 저장할 크기 초기화
            } else sum += x; // mid 값을 초과하지 않는다면 블루레이에 저장
        }
        return cnt;
    }

    public int solution(int M, int[] arr) {
        int answer = 0;
        int lt = Arrays.stream(arr).max().getAsInt(); // arr 배열에서 최댓값 구하기
        int rt = Arrays.stream(arr).sum(); // arr 배열에 있는 모든 값 더하기

        // 이분 탐색 진행
        while(lt <= rt) {
            int mid = (lt + rt) / 2;
            if(count(arr, mid) <= M) { // 블루레이 개수가 M개 이하라면 (정답 가능성 O)
                answer = mid; // 해당 값 저장
                rt = mid - 1; // 오른쪽 포인터를 mid 앞으로 옮기기
            } else lt = mid + 1; // M개를 초과한다면 왼쪽 포인터를 옮기기
        }
        return answer;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());
        int[] arr = new int[N];

        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken());

        Main T = new Main();
        System.out.println(T.solution(M, arr));
    }

}

 

 

느낀 점 및 정리 ✍️

1. 이분 탐색... 쉽지 않다 ... 고려할 내용들이 많아서 푸는 내내 헷갈렸다 ㅜ 설계를 조금 더 꼼꼼하게 하고 들어가야겠다

 

 

 

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

👇 정답 코드

SELECT a.author_id AS AUTHOR_ID
		, a.author_name AS AUTHOR_NAME
        , b.category AS CATEGORY
        , SUM(b.price * s.sales) AS TOTAL_SALES
FROM author AS a
    LEFT JOIN book AS b ON b.author_id = a.author_id
    LEFT JOIN book_sales AS s ON s.book_id = b.book_id
WHERE s.sales_date LIKE '2022-01%'
GROUP BY AUTHOR_ID, CATEGORY
ORDER BY author_id ASC, category DESC

 

느낀 점 및 정리 ✍️

1. author, book, book_sales 테이블을 다함께 JOIN 시켜준 뒤 날짜가 2022-01인 경우만 추출했다

2. author_id와 category를 그룹화 시켜주었다.

3. WHERE 절에 작성한 내용은 WHERE YEAR(s.sales_date) = 2022 AND MONTH(s.sales_date) = 1 이라고 작성해도 된다.

 

 

 

https://leetcode.com/problems/rising-temperature/description/

 

SELECT today.id AS id
FROM weather AS today
    INNER JOIN weather AS yesterday ON DATE_ADD(yesterday.recordDate, INTERVAL 1 DAY) = today.recordDate
WHERE today.temperature > yesterday.temperature

 

 

느낀 점 및 정리 ✍️

1. 셀프 조인의 경우, 동일 테이블을 사용하는 것인 만큼 별칭을 잘 활용해야 헷갈리지 않게 작성할 수 있는 것 같다

 

 

 

https://leetcode.com/problems/employees-earning-more-than-their-managers/description/

 

SELECT e.name AS Employee
FROM employee AS e
    INNER JOIN employee AS m ON e.managerid = m.id
WHERE e.salary > m.salary

 

느낀 점 및 정리 ✍️

1. 셀프 조인을 사용하였다

 

 

 

https://leetcode.com/problems/customers-who-never-order/description/

 

 

 

SELECT name AS Customers
FROM customers
    LEFT JOIN orders ON customers.id = orders.customerid
WHERE orders.customerid IS NULL

 

느낀 점 및 정리 ✍️

1. 한 번도 주문하지 않은 고객을 찾기 위해 INNER JOIN이 아닌 OUTER JOIN을 활용했다.

2. customers.id와 orders.customerId로  JOIN 시킨 뒤, Orders의 id가 NULL인 customer의 name을 가져왔다.

 

 

+ Recent posts

loading