프로그래머스

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

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
  SELECT AO.ANIMAL_ID, 
         AO.NAME
    FROM ANIMAL_OUTS AO
    JOIN ANIMAL_INS AI
      ON AO.ANIMAL_ID=AI.ANIMAL_ID
   WHERE AO.DATETIME < AI.DATETIME
ORDER BY AI.DATETIME
;
 
 

🙂 확인 사항

1. ANIMAL_INS, ANIMAL_OUTS 테이블

2. 보호 시작일보다 입양일이 더 빠른 동물

3. 아이디, 이름 조회

4. 보호 시작일 오름차순 정렬

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WITH JOINTABLE AS (
    SELECT AO.ANIMAL_ID, 
           AO.NAME, 
           AI.DATETIME DATETIME_IN,
           AO.DATETIME DATETIME_OUT
      FROM ANIMAL_OUTS AO
      JOIN ANIMAL_INS AI
        ON AO.ANIMAL_ID=AI.ANIMAL_ID
)
  SELECT ANIMAL_ID, NAME
    FROM JOINTABLE
   WHERE DATETIME_IN>DATETIME_OUT
ORDER BY DATETIME_IN
;
 
 

공통 표현식 사용

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

🚨 시간초과

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
    public int[] solution(int[] sequence, int k) {
        int[] answer = {01000000};
        
        int i, j;
        for(i=0; i<sequence.length; i++){
            int sum=0;
            for(j=i; j<sequence.length; j++){
                if(sum==k){
                    if((j-i)<(answer[1]-answer[0])){
                        answer[0= i;
                        answer[1= j;
                        break;                        
                    }
                }
                if(sum<k){
                    sum += sequence[j];                    
                }
            }
        }
        return answer;
    }
}
 
 

이중 for문으로 인한 시간복잡도 향상(O(n))

 

😮 찾아본 풀이

⭐ 투 포인터

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
    int[] answer = {0, 1_000_000};
    
    public int[] solution(int[] sequence, int k) {
        
        int left = 0;
        int right = 0;
        
        int sum=0;
        while(right < sequence.length) {
            sum += sequence[right++];
            while(sum>k){
                sum -= sequence[left++];
            }
            
            if(sum==k){
                changeArr(left, right-1);
            }
        }
        return answer;
    }
    
    private void changeArr(int left, int right){
        if(right-left<answer[1]-answer[0]){
            answer[0= left;
            answer[1= right;
        }
    }
}
 
 

1. while(right < sequence.length)

    - sequence 길이 전까지 반복

2. sum += sequence[right++]

    - right pointer를 키워가며 sum에 덧셈

3. while(sum>k)

    - 단, sum이 k보다 커질 경우, left pointer를 키워가며 sum 뺄셈

4. if(sum==k)

    - changeArr(left, right-1)

        - 길이가 더 짧은 경우에만 answer에 입력하는 함수 작성

        - 단, right pointer의 경우 후위연산자로 1커졌으므로 조정 필요

        - 먼저 발견된 pointer를 출력하기 위해 if 조건문에 동등 연산자 제외

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[Java] 연속된 부분 수열의 합 - Lv2 프로그래머스

https://school.programmers.co.kr/learn/courses/30/lessons/178870 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞

mag1c.tistory.com

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class Solution {
    public String solution(int a, int b) {
        String answer = "";
        String[] strArr = {"THU""FRI""SAT""SUN""MON""TUE""WED"};
        
        int monthDay = calcMonthToDay(a) + b;
        answer = strArr[monthDay%7];
 
        return answer;
    }
    
    public static int calcMonthToDay(int month){
        int day = 0;
        while(--month>0){
            switch (month) {
                case 2:
                    day += 29;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    day += 30;
                    break;
                default:
                    day += 31;
            }
        }
        return day;
    }
}
 
 

🤔 해설

1. calcMonthToDay(int month)

    - switch문을 활용한 일자 계산

    - while(--month>0)

        - 해당 월은 계산하지 않으므로 전위 연산자 사용

2. String[] strArr

    - 1월 1일 기준 금요일에 맞춰 strArr 선언

3. strArr[monthDay%7]

    - 요일 구하기

 

😮  외의 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
  public String solution(int a, int b) {
      String answer = "";
 
      int[] lastDayOfTheMonth = {31,29,31,30,31,30,31,31,30,31,30,31};
      String[] DayOfTheWeek ={"FRI","SAT","SUN","MON","TUE","WED","THU"};
      int totalDay = 0;
      for(int i = 0 ; i< a-1; i++){
          totalDay += lastDayOfTheMonth[i];
      }
      totalDay += b-1;
      answer = DayOfTheWeek[totalDay %7];
 
      return answer;
  }
}
 
 

* 배열 활용

 

1
2
3
4
5
6
7
8
import java.time.*;
 
class Solution {
  public String solution(int a, int b) {
      return LocalDate.of(2016, a, b).getDayOfWeek().toString().substring(0,3);
  }
}
 
 

* time 함수 사용

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

 

Language: Java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
    boolean solution(String s) {
        
        // 1. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return
        // 2. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴'
        // 3. 개수를 비교할 때 대문자와 소문자는 구별하지 않음
        
        boolean answer = true;
        int cnt = 0;
        
        s = s.toLowerCase();
        for(int i=0; i<s.length(); i++){
            char c = s.charAt(i);
            if(c=='p'){
                cnt++;
            }
            if(c=='y'){
                cnt--;
            }
        }
        
        if(cnt!=0){
            answer = false;
        }
 
        return answer;
    }
}
 
 

🤔 해설

1. toLowerCase()

    - 대소문자 -> 소문자로 통일

2. for문 + if문

    - p일 때는 cnt +1, y일 때는 cnt -1로 stack과 유사하게 구현

    - cnt가 0일 때만 true 반환

 

😮  외의 풀이

1
2
3
4
5
6
7
8
class Solution {
    boolean solution(String s) {
        s = s.toUpperCase();
 
        return s.chars().filter( e -> 'P'== e).count() == s.chars().filter( e -> 'Y'== e).count();
    }
}
 
 

* 람다식 사용

 

1
2
3
4
5
6
7
class Solution {
    boolean solution(String s) {
 
        return s.replaceAll("[^yY]""").length() - s.replaceAll("[^pP]""").length() == 0 ? true : false;
    }
}
 
 

* 정규식 사용

    - s.replaceAll("[^yY]", "")

        - y 또는 Y가 아닌 문자 제거(공란으로 replace)

 

🚨 문자열을 두 번 수정하고 두 번 길이를 계산하므로 효율적이지 않을 수 있음

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

 

📝 Language: Oracle

 

1
2
3
4
5
6
7
8
9
  SELECT II.INGREDIENT_TYPE, 
         SUM(FH.TOTAL_ORDER) TOTAL_ORDER
    FROM FIRST_HALF FH
    JOIN ICECREAM_INFO II
      ON FH.FLAVOR=II.FLAVOR
GROUP BY II.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER
;
 
 

🙂 확인 사항

1. FIRST_HALF, ICECREA_INFO 테이블

2. 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총 주문량 조회

3. 총주문량 기준 오름차순

4. 총주문량 컬럼명: TOTAL_ORDER

 

😮  외의 풀이

1
2
3
4
5
6
7
8
 SELECT DISTINCT II.INGREDIENT_TYPE, 
         SUM(FH.TOTAL_ORDER) OVER (PARTITION BY II.INGREDIENT_TYPE) TOTAL_ORDER
    FROM FIRST_HALF FH
    JOIN ICECREAM_INFO II
      ON FH.FLAVOR=II.FLAVOR
ORDER BY TOTAL_ORDER
;
 
 

윈도우 함수 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH JOINTABLE AS(
    SELECT II.INGREDIENT_TYPE, 
           FH.TOTAL_ORDER
      FROM FIRST_HALF FH
      JOIN ICECREAM_INFO II
        ON FH.FLAVOR=II.FLAVOR
)
  SELECT INGREDIENT_TYPE, 
         SUM(TOTAL_ORDER)
    FROM JOINTABLE
GROUP BY INGREDIENT_TYPE
ORDER BY SUM(TOTAL_ORDER)
;
 
 

 

 

 

🔗 소스 코드
GitHub