프로그래머스

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

programmers.co.kr

 

🙂 확인 사항

1. FOOD_ORDER 테이블

2. 주문 ID, 제품 ID, 출고일자, 출고여부 조회

3. 출고여부는 5월 1일까지 출고완료로 이 후 날짜는 출고 대기로 미정이면 출고미정으로 출력

4. 주문 ID를 기준으로 오름차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
12
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         CASE
             WHEN OUT_DATE <= DATE '2022-05-01' THEN '출고완료'
             WHEN OUT_DATE > DATE '2022-05-01' THEN '출고대기'
             ELSE '출고미정'
         END 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

CASE문

 

1
2
3
4
5
6
7
8
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         DECODE(SIGN(OUT_DATE - DATE '2022-05-02'), -1'출고완료'1'출고대기''출고미정') 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

DECODE문

* SIGN

- 숫자의 부호를 반환하는 함수

    - 기준일을 5월 2일로 하여 부호 활용

 

🚨 통과는 했지만, 출고일이 5월 2일일 경우, 출고 대기가 나와야하지만 출고 미정이 출력될 수 있음

1
2
3
4
5
6
7
8
  SELECT ORDER_ID, 
         PRODUCT_ID, 
         TO_CHAR(OUT_DATE, 'YYYY-MM-DD') OUT_DATE,
         DECODE(SIGN(OUT_DATE - DATE '2022-05-02'), -1'출고완료'0'출고대기'1'출고대기''출고미정') 출고여부
    FROM FOOD_ORDER
ORDER BY ORDER_ID
;
 
 

정확하게는 위와 같이 0일 경우도 추가해야 함

 

 

 

🔗 소스 코드
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class Solution {
    public int[] solution(String[] wallpaper) {
        int[] answer = new int[4];
        
        int east = wallpaper[0].length();
        int west = 0;
        int north = wallpaper.length;
        int south = 0;
        
        
        for(String row : wallpaper) {
            east = east > calcRowMin(row) ? calcRowMin(row) : east;
            west = west < calcRowMax(row) ? calcRowMax(row) : west;
        }
        
        for(int i=0; i<wallpaper.length; i++) {
            if(calcMinSharp(wallpaper[i])) {
                north = i;
                break;                
            }
        }
        
        for(int i=0; i<wallpaper.length; i++) {
            south = calcMaxSharp(wallpaper[i]) ? i : south;
        }
        
        answer[0= north;
        answer[1= east;
        answer[2= south+1;
        answer[3= west+1;
        
        
        return answer;
    }
 
    public static int calcRowMin(String row) {
        int min=row.length();
 
        for(int i=0; i<row.length(); i++) {
            if(row.charAt(i)=='#') {
                min = min > i ? i : min;
                break;
            }
        }
        
        return min;
        
    }
    
    public static int calcRowMax(String row) {
        int max=-1;
 
        for(int i=row.length()-1; i>=0; i--) {
            if(row.charAt(i)=='#') {
                max = max < i ? i : max;
                break;
            }
        }
        
        return max;
        
    }
    
    public static boolean calcMinSharp(String row) {
        boolean result = false;
 
        for(int i=0; i<row.length(); i++) {
            if(row.charAt(i)=='#') {
                result = true;
                break;
            }
        }
 
        return result;
        
    }
 
    public static boolean calcMaxSharp(String row) {
        boolean result = false;
 
        for(int i=row.length()-1; i>=0; i--) {
            if(row.charAt(i)=='#') {
                result = true;
                break;
            }
        }
 
        return result;
        
    }
 
}
 
 

1. int east, west, north, south

    - 상하좌우 최대, 최소를 담을 변수 선언

2. calcRowMin

    - 좌우 최소값 탐색

3. calcRowMax

    - 좌우 최대값 탐색

4. calcMinSharp

    - 상하 최소값(배열 중 첫번째 Sharp 위치) 탐색

5. calcMaxSharp

    - 상하 최대값(배열 중 마지막 Sharp 위치) 탐색

 

 

😮 찾아본 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
    public int[] solution(String[] wallpaper) {
        int minX = 50;
        int minY = 50;
        int maxX = -1;
        int maxY = -1;
        for(int i=0; i< wallpaper.length; i++){
            for(int j=0; j<wallpaper[i].length(); j++){
                if(wallpaper[i].charAt(j)=='#'){
                    minX = Math.min(minX,i);
                    minY = Math.min(minY,j);
                    maxX = Math.max(maxX,i);
                    maxY = Math.max(maxY,j);
                }
            }
        }
        return new int[]{minX,minY,maxX+1,maxY+1};
    }
}
 
 

* Min, Max 함수 활용

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. ANIMAL_INS, ANIMAL_OUTS 테이블

2. 보호소에 들어올 당시에는 중성화되지않았지만,

3. 보호소를나갈 당시에는 중성화된

4. 동물의 아이디, 생물 종, 이름 조회

5. 아이디 순 오름차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
SELECT AI.ANIMAL_ID, 
       AI.ANIMAL_TYPE, 
       AI.NAME
  FROM ANIMAL_INS AI
  JOIN ANIMAL_OUTS AO
    ON AI.ANIMAL_ID=AO.ANIMAL_ID
 WHERE AI.SEX_UPON_INTAKE LIKE 'Intact%'
   AND (AO.SEX_UPON_OUTCOME LIKE 'Spayed%' 
    OR AO.SEX_UPON_OUTCOME LIKE 'Neutered%')
    ;
 
 

* WHERE 조건절

- OR 연산자 순위가 AND 연산자보다 낮으므로 () 사용

 

1
2
3
4
5
6
7
8
9
10
SELECT AI.ANIMAL_ID, 
       AI.ANIMAL_TYPE, 
       AI.NAME
  FROM ANIMAL_INS AI
  JOIN ANIMAL_OUTS AO
    ON AI.ANIMAL_ID=AO.ANIMAL_ID
 WHERE AI.SEX_UPON_INTAKE LIKE 'Intact%'
   AND REGEXP_LIKE(AO.SEX_UPON_OUTCOME, '^(Spayed|Neutered)')
   ;
   
 

* 정규 표현식 사용

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. PLACES 테이블

2. 헤비 유저

3. 아이디 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
  SELECT * 
    FROM PLACES
   WHERE HOST_ID IN (
         SELECT HOST_ID 
           FROM PLACES
       GROUP BY HOST_ID
         HAVING COUNT(HOST_ID) > 1)
ORDER BY ID
;
 
 

* 중첩 SubQuery

 

1
2
3
4
5
6
7
8
9
10
11
12
13
WITH CONDITIONS AS (
      SELECT HOST_ID 
        FROM PLACES
    GROUP BY HOST_ID
      HAVING COUNT(HOST_ID) > 1
)
  SELECT P.*
    FROM PLACES P
    JOIN CONDITIONS C 
      ON P.HOST_ID = C.HOST_ID
ORDER BY P.ID
;
 
 

* 공통 표현식 + Inner Join

 

1
2
3
4
5
6
7
8
9
10
11
12
WITH CONDITIONS AS (
      SELECT HOST_ID 
        FROM PLACES
    GROUP BY HOST_ID
      HAVING COUNT(HOST_ID) > 1
)
  SELECT *
    FROM PLACES
   WHERE HOST_ID IN (SELECT HOST_ID FROM CONDITIONS)
ORDER BY ID
;
 
 

* 공통 표현식 + 중첩 Sub Query

 

⭐Oracle SQL에서는 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
25
26
27
28
29
30
31
32
33
34
import java.util.Map;
import java.util.HashMap;
 
class Solution {
    static int[] answer;
    static Map<String, Integer> yearningScore;
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
 
        answer = new int[photo.length];
        
        yearningScore = new HashMap<>();
        
        for(int i=0; i<name.length; i++){
            yearningScore.put(name[i], yearning[i]);
        }
        
        int index=0;
        for(String[] peopleInPhoto : photo){
            answer[index++= calcYearningScore(peopleInPhoto);
        }
        
        return answer;
    }
    
    public int calcYearningScore(String[] peopleInPhoto){
        int sumYearning = 0;
        for(String personInPhoto : peopleInPhoto){
            if(yearningScore.get(personInPhoto)!=null)
                sumYearning += yearningScore.get(personInPhoto);
        }
        return sumYearning;
    }
}
 
 

1. yearningScore = new HashMap<>();

    - key: 인물, value: 그리움 점수

2. answer[index++] = calcYearningScore(peopleInPhoto);

    - 그리움 점수 계산

    - if(yearningScore.get(personInPhoto)!=null)

        - 사진 속 그리움 대상 인물이 아니라면, yearningScore로 부터 그리움 점수 합산

 

😮 찾아본 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
    public int[] solution(String[] name, int[] yearning, String[][] photo) {
        int[] answer = new int[photo.length];
        for(int i=0; i<photo.length; i++){
            for(int j=0; j<photo[i].length; j++){
                for(int k=0; k<name.length; k++){
                    if(photo[i][j].equals(name[k])) answer[i] += yearning[k];
                }
            }
        }
        return answer;
    }
}
 
 

* 3중 for문

    - photo의 각 인물과 name 배열 비교

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr