알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

https://school.programmers.co.kr/learn/courses/30/lessons/151141

 

프로그래머스

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

programmers.co.kr


Think🤔

CAR_RENTAL_COMPANY_CAR : 자동차들의 정보

CAR_RENTAL_COMPANY_RENTAL_HISTORY : 자동차 대여 기록

CAR_RENTAL_COMPANY_DISCOUNT_PLAN : 자동차 종류 별 대여 기간 종류별 할인 정책

 

1. 자동차 종류가 ' 트럭 '

2. 트럭의 대여 금액 기록 ID와 대여 금액 리스트 출력

3. 대여 금액 기준 내림차순, 기록 ID 기춘 내림차순 + FEE는 정수부분만 출력

4. END_DATE - START_DATE 하면 대여기간이 나옴 곱하기 DAILY_FEE를 한 후 그다음에 마지막에 할인율 적용

 

SELECT A.HISTORY_ID
       , DAILY_FEE * (CASE 
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 90 THEN 0.9
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 30 THEN 0.93
            WHEN TO_DATE(END_DATE) - TO_DATE(START_DATE) >= 7 THEN 0.95
            ELSE 1
         END) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID;

 

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 컬럼은 사용하지 않고 , 90 30 7일 이상 배율을 DAILY_FEE로 곱해줬다.

10% 할인이니 0.9를 곱해주면 90%가격이 나오는 것처럼 타입도 트럭 맞고, 정렬 조건도 맞는데 정답이 맞지 않음..

 

SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN DATEDIFF(END_DATE,START_DATE) >= 90 THEN 0.9
            WHEN DATEDIFF(END_DATE,START_DATE) >= 30 THEN 0.93
            WHEN DATEDIFF(END_DATE,START_DATE) >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;

 

수수료를 곱하고 DATEDIFF와 또 하루 같으면 TO_DATE - TO_DATE 할 경우 + 1을 해줬는데 틀림..

결괏값을 보니 정답하고 ROW 수는 똑같은데 FEE 숫자가 살짝씩 달랐음...

 

 SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN END_DATE - START_DATE + 1 >= 90 THEN 0.85
            WHEN END_DATE - START_DATE + 1 >= 30 THEN 0.92
            WHEN END_DATE - START_DATE + 1 >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;

이게 정답이였음

 

문제에서는 트럭 할인율이 5%,7%,10% 였음

하나하나 테이블을 조회해봤는데 5%,8%,15%로 나옴

 

테이블을 조인해서 사용하면 하드코딩할 필요가 없어진다. 다시 작성


Solution✍
 SELECT A.HISTORY_ID
       , ROUND(DAILY_FEE * 
         (CASE 
            WHEN END_DATE - START_DATE + 1 >= 90 THEN 0.85
            WHEN END_DATE - START_DATE + 1 >= 30 THEN 0.92
            WHEN END_DATE - START_DATE + 1 >= 7 THEN 0.95
            ELSE 1
         END) *
         (TO_DATE(END_DATE) - TO_DATE(START_DATE) + 1),0) AS FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B
    ON A.CAR_ID = B.CAR_ID
   AND CAR_TYPE = '트럭'
 ORDER BY FEE DESC , A.HISTORY_ID DESC;
SELECT S1.HISTORY_ID
        , ROUND((DAILY_FEE - (DAILY_FEE * (NVL(DISCOUNT_RATE,0)/100))),0) * DURATION AS FEE
    FROM
       (
       SELECT A.CAR_ID
              , DAILY_FEE
              , END_DATE - START_DATE + 1 AS DURATION
              , B.HISTORY_ID
              , CASE WHEN END_DATE - START_DATE >= 90
                    THEN '90일 이상'
                    WHEN END_DATE - START_DATE >= 30
                    THEN '30일 이상'
                    WHEN END_DATE - START_DATE >= 7
                    THEN '7일 이상'
                    ELSE '7일 미만'
                END AS DURATION_TYPE
       FROM CAR_RENTAL_COMPANY_CAR A JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
         ON A.CAR_ID = B.CAR_ID
      WHERE A.CAR_TYPE = '트럭') S1
      
     LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
         ON S1.DURATION_TYPE = C.DURATION_TYPE
        AND C.CAR_TYPE = '트럭'
        ORDER BY FEE DESC , HISTORY_ID DESC;

서브쿼리에서 조인 DURATION_TYPE 과의 조인 조건을 만들어내서 조인을 함.


Review🤩

생각보다 어렵다 ... 2일 걸림


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/challenges?order=acceptance_desc&statuses=unsolved&languages=oracle%2Cmysql&page=1

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr

정답률 높은 문제 기준 10문제입니다.


Think🤔

 

쉬운 문제이니 바로바로 풀기


Solution✍

동물 수 구하기

SELECT COUNT(1) FROM ANIMAL_INS;

중복 제거하기

SELECT COUNT(DISTINCT(NAME))  FROM ANIMAL_INS WHERE NAME IS NOT NULL;

나이 정보가 없는 회원 수 구하기

SELECT COUNT(USER_ID) FROM USER_INFO WHERE AGE IS NULL;

이름에 el이 들어가는 동물 찾기

select ANIMAL_ID , NAME from animal_ins WHERE LOWER(NAME) LIKE '%el%' AND animal_type = 'Dog' order by name;

 -> 대소문자 구분하지 않는다고 되어 있는데 구분함..

 

가장 비싼 상품 구하기

SELECT MAX(PRICE) AS MAX_PRICE FROM PRODUCT;

 

NULL 처리하기

SELECT ANIMAL_TYPE,NVL(NAME, 'No name') AS NAME,SEX_UPON_INTAKE from ANIMAL_INS  order by ANIMAL_ID;

강원도에 위치한 생산공장 목록 출력하기

SELECT FACTORY_ID ,FACTORY_NAME ,ADDRESS FROM FOOD_FACTORY WHERE ADDRESS LIKE '강원도%' ORDER BY FACTORY_ID;

경기도에 위치한 식품창고 목록 출력하기

SELECT WAREHOUSE_ID ,WAREHOUSE_NAME ,ADDRESS ,NVL(FREEZER_YN,'N') FROM FOOD_WAREHOUSE WHERE ADDRESS LIKE '경기도%' ORDER BY WAREHOUSE_ID;

 

DATETIME에서 DATE로 형 변환

SELECT ANIMAL_ID,NAME, TO_CHAR(DATETIME,'YYYY-MM-DD') AS 날짜 FROM ANIMAL_INS ORDER BY ANIMAL_ID;

흉부외과 또는 일반외과 의사 목록 출력하기

SELECT DR_NAME , DR_ID , MCDP_CD , TO_CHAR(HIRE_YMD,'YYYY-MM-DD') FROM DOCTOR WHERE MCDP_CD IN ('CS','GS') ORDER BY HIRE_YMD DESC , DR_NAME;

Review🤩

 

문제에 애매모호한 문장이 많다. 예를 들면, 대소문자 구분하지 않는데 구분하는 경우 또는 출력결과의 내용이 문제에 안들어가있고 출력결과로 확인해서 답을 도출해야 되는 문제 등등..


 

상품알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

프로그래머스

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

programmers.co.kr


Think🤔

회원정보 테이블 : USER_INFO

온라인 상품 판매 정보 : ONLINE_SALE 

컬럼 : USER_ID , GENDER , AGE , JOINED

 

아이디 / USER_ID / INTEGER / FALSE(널값 허용)

성별 / GENDER / TINYINT(1) / TRUE / GENDER 0 -> 남자 , 1 -> 여자

나이 / AGE / INTEGER / TRUE

가입일 / JOINED / DATE / FALSE

 

온라인 상품판매 ID / ONLINE_SALE_ID / INTEGER  / FALSE

회원 ID / USER_ID / INTEGER  / FALSE

상품 ID / PRODUCT_ID / INTEGER  / FALSE

판매량 / SALES_AMOUNT / INTEGER  / FALSE

판매일 / SALES_DATE / INTEGER  / FALSE

 

2021년 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율

 

상품을 구매한 회원의 비율 : 2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수

을 년,월 별로 출력

 

소수점 두번째자리에서 반올림 / 년,월 기준으로 오름차순

 

2021년에 가입한 전체 회원수

SELECT * FROM USER_INFO WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31'

2021년에 가입한 회원 중 상품을 구매한 회원수

SELECT COUNT(1) 
  FROM USER_INFO A JOIN ONLINE_SALE 
    ON A.USER_ID = B.USER_ID
 WHERE A.JOINED BETWEEN '2021/01/01' AND '2021/12/31'

 

정답 도출하는 부분

 

그룹바이로 년,월

 SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR
        , TO_CHAR(SALES_DATE, 'MM') AS MONTH
        , COUNT(1) AS PUCHASED_USERS
        , ROUND((FULL_USR / BUY_FULL_USR),2) AS PUCHASED_RATIO
   FROM (
  		 SELECT (SELECT COUNT(1) FROM USER_INFO WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31') AS FULL_USER
               , COUNT(1) AS BUY_FULL_USR
               , B.SALES_DATE AS SALES_DATE
           FROM USER_INFO A JOIN ONLINE_SALE B
             ON A.USER_ID = B.USER_ID
          WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31'
         )
GROUP BY YEAR DESC , MONTH DESC;

1차 수정

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_CHAR(SALES_DATE, 'MM') AS MONTH,
       COUNT(1) AS PURCHASED_USERS,
       ROUND((FULL_USER / BUY_FULL_USER), 2) AS PURCHASED_RATIO
FROM (
       SELECT (SELECT COUNT(1) FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021/01/01', 'YYYY/MM/DD') AND TO_DATE('2021/12/31', 'YYYY/MM/DD')) AS FULL_USER,
              COUNT(1) AS BUY_FULL_USER,
              B.SALES_DATE AS SALES_DATE
       FROM USER_INFO A
       JOIN ONLINE_SALE B ON A.USER_ID = B.USER_ID
       WHERE JOINED BETWEEN TO_DATE('2021/01/01', 'YYYY/MM/DD') AND TO_DATE('2021/12/31', 'YYYY/MM/DD')
       GROUP BY B.SALES_DATE
     )
GROUP BY YEAR DESC, MONTH DESC;

TO_DATE를 이용해서 BETWEEN 사용

 

중복된 아이다값을 제거하기 위해서 DISTINCT() 삽입

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 2) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR DESC , MONTH DESC;

 

중복되는 서브쿼리 제거

BUY_FULL_USR때문에 서브쿼리를 썻으나 그렇게하면 서브쿼리안에 있는 값이 이상하게 됨

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 2) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR DESC , MONTH DESC;

 


Solution✍

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 1) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR,MONTH;

문제는 오름차순인데 내림차순으로 적음... 왜 안되지 했음... 

그리고 ROUN1로 해야지 소수점 두번째 자리에서 반올림^^...


 

Review🤩

들여쓰기 이쁘게 안되는건 별로네... 티스토리 이상해요


 

 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

 

문제는 숫자야구 입니다.

1. 컴퓨터값이 0~9까지의 숫자값이 중첩되지 않게 만들어집니다. ( 1,5,6 이런식 1,5,5 X )

2. 사용자가 값을 입력합니다. (1,2,3)

3. 컴퓨터의 값이 1,5,6일 경우 1,2,3을 입력하면 1은 값하고 위치가 똑같기 때문에 1스트라이크가 됩니다.

4. 1,5,6 에서 1,6,5를 입력한 경우 1은 값하고 위치가 똑같고, 6,5는 위치가 다르기 때문에 2스트라이크 1볼이 됩니다.

5. 3스트라이크를 하게 되면 게임이 종료되고 시도 횟수가 나오고 , 게임을 다시 시작할것인지 물어봅니다.

6. 1번을 입력하면 게임을 다시 실행하고 2번을 입력하면 게임은 종료됩니다.


Think🤔

 

코드에 주석으로 설명 덧붙임


Solution✍
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

// 게임 시작
public class start {
    // 싱글톤 , 클래스의 인스턴스간에 공유 오직 한번 할당
    // system.in을 사용해서 한번만 초기화해서 사용하면 자원 낭비 방지
    // 상수값으로 선언하면 프로그램 가독성 향상
    // 테스트에서 예상치 못한 상태 변경을 방지
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    public static void main(String[] args) {
        System.out.println("게임을 시작합니다.");
        try {
            String retry = "";
            while(true){
                startGame(reader);
                System.out.println("게임을 새로 시작하려면 1, 종료하려면 2를 입력하세요.");
                retry = reader.readLine();
                if(retry.equals("1")){
                    System.out.println("게임을 새로 시작합니다.");
                    continue;
                }else if(retry.equals("2")){
                    System.out.println("게임을 종료합니다.");
                    break;
                }else{
                    System.out.println("올바른 값이 입력되지 않았습니다.");
                    continue;
                }
            }

        } catch (IOException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }

    }

    public static void startGame(BufferedReader reader){
        String retry = "";
        try {
            System.out.println("이름을 입력해주십시오.");
            String name = reader.readLine();
            System.out.println("안녕하세요, " + name + "님!");

            // 컴퓨터 수 생성 3자리 1~9까지
            // Math.random() 범위 0.0이상 8.999.. 이하 double값을 얻음 -> int로 형 변환 필요 , +1을 해줌으로써 1~9까지의 정수

            /*
            서로 다른 임의의 수 만족 X

            int ranNum = (int)(Math.random() * 9) + 1;
            int digit = 1; // 자릿수 증가

            for(int i=0; i<3; i++){
                comNum+=ranNum*digit;
                digit*=10;
            }
            */
            List<Integer> digits = new ArrayList<>();
            for (int i = 1; i <= 9; i++) {
                digits.add(i);
            }
            // 숫자 섞기
            Collections.shuffle(digits);
            int comNum = digits.get(0) * 100 + digits.get(1) * 10 + digits.get(2);
            //맞출때까지

            int tryCnt = 0; // 시도 횟수
            int userNum = 0;

            while(true){
                tryCnt++;
                int strike = 0;
                int ball = 0;
                System.out.println("숫자를 입력해주세요 : ");
                userNum = Integer.parseInt(reader.readLine());
                if(userNum > 1000){
                    System.out.println("숫자는 3개만 입력 가능합니다.");
                    continue;
                }

                String comStr = Integer.toString(comNum);
                String userStr = Integer.toString(userNum);
                for(int i=0; i<comStr.length(); i++){
                    for(int j=0; j<userStr.length(); j++){
                        if(comStr.charAt(i) == userStr.charAt(i)){
                            strike++;
                            break;
                        }else if(comStr.charAt(i) == userStr.charAt(j)){
                            ball++;
                            break;
                        }
                    }
                }
                System.out.println(ball + "볼 , " + strike + "스트라이크");

                if(strike == 3){ // 다 맞출 경우 종료
                    System.out.println("3개의 숫자를 모두 맞히셨습니다! 게임 종료");
                    System.out.println("시도 횟수 : " + tryCnt);
                    break;
                }
            }
            //reader.close(); // 자원 누수 발생 방지 close , 입출력스트림은 외부 자원과의 연결을 유지하고 있을 수 있기 떄문

            /*
            * But 여러번 사용해야 하는 경우에는 닫지 않는 것이 좋습니다.
            * 해결책으로는 System.in을 한 번만 사용하여 BufferedReader를 만들고,
            * 이를 계속 재사용하도록 수정하는 것이 좋습니다.
            * System.in에 대한 닫음(close)은 피하는 것이 좋습니다.
            * */
        } catch (IOException e){
            e.printStackTrace();
        } catch (Exception e){
            e.printStackTrace();
        }
    }
}

 


Review🤩

 

입력값에 대해 이해도가 올라갔고, 최적화가 안되어 있어서 다시 풀어야 된다.

싱글톤 패턴으로 구현해야겠다.

 

https://github.com/woowacourse/java-baseball-precourse

 

GitHub - woowacourse/java-baseball-precourse: 숫자 야구게임 미션을 진행하는 저장소

숫자 야구게임 미션을 진행하는 저장소. Contribute to woowacourse/java-baseball-precourse development by creating an account on GitHub.

github.com

포크한 후 내부 함수를 이용해서 다음에 풀어보도록 하겠습니다.


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/42842

 

프로그래머스

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

programmers.co.kr


Think🤔

1. 전체 면적 구하기

2. 노란색 면적 구하기

3. 전체 - 노란색 = 갈색

 

내가 생각한 방법은 아니고 모르겠어서 방법만 참조하고 코드를 구현해본다

 

1. 전체 면적 구하기
2. 노란색 면적 구하기
3. 전체 - 노란색 = 갈색

18 b : 14 y : 4  ---> 6,3
15 b : 12 y : 3  ---> 5,3
12 b : 10 y : 2  ---> 4,3 

36 b : 20 y : 16 ---> 6,6 / 16 + 4   4제곱
25 b : 16 y : 9 --->  5,5 / 12 + 4   3제곱
16 b : 12 y : 4  ---> 4,4 / 8 + 4    2제곱
9 b : 8   y : 1 ---> 3,3  / 4 + 4    1제곱


규칙은 이런식
사각형인지 , 직사각형인지 판단 방법

45334795 

테스트 4
입력값 〉 18, 6
기댓값 〉 [8, 3]
실행 결과 〉 실행한 결괏값 [6,4]이 기댓값 [8,3]과 다릅니다.

[18, 6] -> [8, 3] (o)
[18, 6] -> [6, 4] (x)


Solution✍
class Solution {
    public int[] solution(int brown, int yellow) {
        int[] answer = new int[2];
        
        int sumArea = brown + yellow; // 24
        
        // 높이 3부터
        for(int i=3; i<sumArea; i++){
            if(sumArea % i == 0){
                int width = sumArea/i; // 전체면적에서 높이를 나눴을 때 떨어지면 넓이가 나옴 // 8
                int height = i;        // 해당 높이 // 3
                
                if(height > width){ // 세로 길이보다 길다 했으므로 , 세로 길이가 더 길면 패쓰.
                    continue;
                }
                
                if((width - 2) * (height - 2) == yellow){
                    answer[0] = width;
                    answer[1] = height;   
                }
            }
        }
        
        return answer;
    }
}

Review🤩

어려워서 답안 좀 참고했음


 

알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/12973

 

프로그래머스

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

programmers.co.kr


Think🤔
import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        
        Stack<Character> st = new Stack<>();

        for(Character c : s.toCharArray()){
            if(st.isEmpty()){
                st.push(c);
            }else if(st.peek() == c){
                st.pop();
            }
        }
        
        if(st.isEmpty()){
            answer = 1;
        }
        
        return answer;
    }
}

테스트코드 

정확성: 59.2
효율성: 38.8
합계: 98.1 / 100.0

4개 실패


Solution✍

스택에 비어있지도 않고 , 같지 않은 경우도 추가를 해줘야 함

import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        
        Stack<Character> st = new Stack<>();

        for(Character c : s.toCharArray()){
            if(st.isEmpty()){
                st.push(c);
            }else if(st.peek() == c){
                st.pop();
            }else{
                st.push(c);
            }
        }
        
        if(st.isEmpty()){
            answer = 1;
        }
        
        return answer;
    }
}

 

import java.util.Stack;

class Solution
{
    public int solution(String s)
    {
        int answer = 0;
        
        Stack<Character> st = new Stack<>();

        for(Character c : s.toCharArray()){
            if(!st.isEmpty() && st.peek() == c){
                st.pop();
            }else{
                st.push(c);
            }
        }
        
        if(st.isEmpty()){
            answer = 1;
        }
        
        return answer;
    }
}

Review🤩

 


 

'Algorithm' 카테고리의 다른 글

자바 숫자야구 구현 - 1  (0) 2023.12.09
[프로그래머스] 카펫  (0) 2023.10.24
[프로그래머스] 문자열 나누기  (0) 2023.10.20
[프로그래머스] 숫자 짝꿍  (0) 2023.10.17
[프로그래머스] 옹알이2  (0) 2023.10.17

+ Recent posts