프로그래머스

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

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
import java.util.*;
 
class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];
        
        Map<Integer, String> runningMap = new HashMap<>();
        for(int i=0; i<players.length; i++){
            runningMap.put(i, runningMap.getOrDefault(i, players[i]));
        };
        
        for(String runner : callings){
            for(int i=0; i<players.length; i++){
                if(runningMap.get(i).equals(runner)){
                    String catchUpRunner = runningMap.get(i-1);
                    runningMap.replace(i-1, runner);
                    runningMap.replace(i, catchUpRunner);
                    break;
                }
            }
        };
        
        
        for(int i = 0; i < players.length; i++){
            answer[i] = runningMap.get(i);
        }
        
        return answer;
    }
}
 
 

😖 시간 초과

* callings( 1백만 ) * players( 5만 ) = 500억

 

 

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
import java.util.*;
 
class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];
        
        Map<Integer, String> runningMapIntStr = new HashMap<>();
        for(int i=0; i<players.length; i++){
            runningMapIntStr.put(i, runningMapIntStr.getOrDefault(i, players[i]));
        };
        
        Map<String, Integer> runningMapStrInt = new HashMap<>();
        for(int i=0; i<players.length; i++){
            runningMapStrInt.put(players[i], runningMapStrInt.getOrDefault(players[i], i));
        };
 
        for(String runner : callings){
            int catchUpRank = runningMapStrInt.get(runner)-1;
            String catchUpRunner = runningMapIntStr.get(catchUpRank);
            runningMapIntStr.replace(catchUpRank, runner);
            runningMapIntStr.replace(catchUpRank+1, catchUpRunner);
            runningMapStrInt.replace(runner, catchUpRank);
            runningMapStrInt.replace(catchUpRunner, catchUpRank+1);
        };
        
        for(int i = 0; i < players.length; i++){
            answer[i] = runningMapIntStr.get(i);
        }
        
        return answer;
    }
}
 
 

1. runningMapIntStr, runningMapStrInt

    - key, value를 ranking과 runner 양방향으로 2개의 Map 선언

2. for(String runner : callings)

    - 순위 변동 시, 2개의 map 모두 replace하도록 유의

    * map은 중복제거되므로 replace 대신 put 사용 가능

 

 

😮 찾아본 풀이

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
import java.util.*;
 
class Solution {
    public String[] solution(String[] players, String[] callings) {
        String[] answer = new String[players.length];
        
        Map<String, Integer> runningMapStrInt = new HashMap<>();
        for(int i=0; i<players.length; i++){
            runningMapStrInt.put(players[i], i);
        };
 
        for(String runner : callings){
            int catchUpRank = runningMapStrInt.get(runner)-1;
            String catchUpRunner = players[catchUpRank];
            runningMapStrInt.put(catchUpRunner, catchUpRank+1);
            runningMapStrInt.put(runner, catchUpRank);
            
            players[catchUpRank] = runner;
            players[catchUpRank+1= catchUpRunner;
        };
        
        int index = 0;
        for(String player : players) {
            answer[index++= player;
        }
 
        return answer;
    }
}
 
 

* runningMapIntStr 대신 players 배열 직접 사용

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

 

🙂 확인 사항

1. ANIMAL_INS, ANIMAL_OUTS 테이블

2. 입양을 간 동물

3. 보호 기간이 가장 길었던 동물 2마리

4. 아이디, 이름 조회

5. 보호기간 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
   SELECT AO.ANIMAL_ID, AO.NAME
     FROM ANIMAL_INS AI
LEFT JOIN ANIMAL_OUTS AO
       ON AI.ANIMAL_ID=AO.ANIMAL_ID
    WHERE AO.ANIMAL_ID IS NOT NULL
 ORDER BY (AO.DATETIME - AI.DATETIME) DESC
    FETCH FIRST 2 ROWS ONLY
;
 
 

* Left Join

    - Full Join: Animal_ins에 포함되지 않은 Animal_outs 값이 도출될 수 있음

 

1
2
3
4
5
6
7
8
9
10
11
12
SELECT * 
  FROM (
     SELECT AO.ANIMAL_ID, AO.NAME
       FROM ANIMAL_INS AI
  LEFT JOIN ANIMAL_OUTS AO
         ON AI.ANIMAL_ID=AO.ANIMAL_ID
      WHERE AO.ANIMAL_ID IS NOT NULL
   ORDER BY (AO.DATETIME - AI.DATETIME) DESC
)
 WHERE ROWNUM <= 2
 ;
 
 

Inline View

 

 

 

🔗 소스 코드
GitHub

 

 

프로그래머스

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

programmers.co.kr

 

🙂 확인 사항

1. USED_GOODS_BOARD 테이블

2. 2022년 10월 5일 등록된

3. 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회

4. 거래 상태별 출력 문구 지정

5. 게시글 ID 내림차순 정렬

 

 

📝 Language: Oracle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  SELECT BOARD_ID, 
         WRITER_ID, 
         TITLE, 
         PRICE,
         CASE
            WHEN STATUS = 'SALE' THEN '판매중'
            WHEN STATUS = 'RESERVED' THEN '예약중'
            WHEN STATUS = 'DONE' THEN '거래완료'
         END STATUS
    FROM USED_GOODS_BOARD
   WHERE CREATED_DATE = DATE '2022-10-05'
ORDER BY BOARD_ID DESC
;
 
 

Case 조건문

 

1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT BOARD_ID, 
       WRITER_ID, 
       TITLE, 
       PRICE,
       DECODE(STATUS, 
              'SALE''판매중',
              'RESERVED''예약중',
              'DONE''거래완료') STATUS
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = DATE '2022-10-05'
ORDER BY BOARD_ID DESC
;
 
 

Decode 조건문

 

- DECODE(STATUS, 'SALE', '판매중', 'RESERVED', '예약중', 'DONE', '거래완료')

    - STATUS 컬럼에 대해

    - SALE이라면, 판매중 출력

    - RESERVED라면, 예약중 출력

    - DONE이라면, 거래완료 출력

    - 초기값 설정도 가능하나, 생략 가능

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[Oracle] 오라클 DECODE 함수 사용방법 (if else, 디코드)

DECODE 함수는 오라클 쿼리에서 가장 많이 사용하는 함수 중 하나이다. 표준 SQL 함수가 아니라서 사용을 꺼려하기도 하지만 잘 사용하면 아주 편하기 때문에 유용하다. 최근에는 CASE WHEN 구문 사용

gent.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
import java.util.Arrays;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        char[] sToCharArr = new char[s.length()];
        for(int i=0; i<s.length(); i++){
            sToCharArr[i] = s.charAt(i);
        }
        Arrays.sort(sToCharArr);
        
        StringBuilder sb = new StringBuilder();
        for(int i=s.length()-1; i>-1; i--){
            sb.append(sToCharArr[i]);
        }
        answer = sb.toString();
        return answer;
    }
}
 
 

1. sToCharArr[i] = s.charAt(i)

    - String → char[]

2. Arrays.sort(sToCharArr)

    - 오름차순 정렬

    - Collections.reverseOrder() 사용 시, 

        - error: no suitable method found for sort(char[],Comparator<Object>) 발생

3. StringBuilder sb = new StringBuilder()

    -역순으로 문자열을 저장할 StringBuilder 선언

4. for(int i=s.length()-1; i>-1; i--)

    - 역순으로 저장

5. answer = sb.toString()

    - StringBuilder → String

 

 

😮 찾아본 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        char[] sToCharArr = s.toCharArray();
        Arrays.sort(sToCharArr);
        
        answer = new StringBuilder(new String(sToCharArr))
            .reverse()
            .toString();
        
        return answer;
    }
}
 
 

1. new StringBuilder(new String(sToCharArr))

    - char[] → String

2. reverse()

    - StringBuilder 내 reverse 함수 사용

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.util.Arrays;
import java.util.Collections;
 
class Solution {
    public String solution(String s) {
        String answer = "";
        
        String[] sArr = s.split("");
        Arrays.sort(sArr, Collections.reverseOrder());
 
        StringBuilder sb = new StringBuilder();
        for(String str : sArr){
            sb.append(str);
        }
        
        answer = sb.toString();
        
        return answer;
    }
}
 
 

1. String[] sArr = s.split("")

    - 문자 1개씩 split → String[]

2. Arrays.sort(sArr, Collections.reverseOrder())

    - 객체: Collections.reverseOrder 사용

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

프로그래머스

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

programmers.co.kr

 

 

프로그래머스

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

programmers.co.kr

🙂 확인 사항

1. 무게 중심 구하기: 경우의수 7개 

2. 2중 for문: 약 100,000* 100,000 = 약 100억

3. 1억 기준 약 1초 -> 100억 100초

 

🚨 시간 초과 실패

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 {
    public long solution(int[] weights) {
        long answer = 0;
        
        for(int i=0; i<weights.length; i++){
            for(int j=i+1; j<weights.length; j++){
                if(weights[i]==weights[j]){
                    answer++;
                    continue;
                }
                if((2*weights[i]==3*weights[j]) || (3*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((2*weights[i]==4*weights[j]) || (4*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((3*weights[i]==4*weights[j]) || (4*weights[i]==3*weights[j])){
                    answer++;
                    continue;
                }
            }
        }
        
        return answer;
    }
}
 
 

 

🚨 정렬을 통해 조건을 줄였지만, 시간 초과 실패

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
import java.util.Arrays;
 
class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        
        Arrays.sort(weights);
        
        for(int i=0; i<weights.length; i++){
            for(int j=i+1; j<weights.length; j++){
                if(weights[i]==weights[j]){
                    answer++;
                    continue;
                }
                if((3*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((4*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((4*weights[i]==3*weights[j])){
                    answer++;
                    continue;
                }
            }
        }
        
        return answer;
    }
}
 
 

 

🚨 정렬을 통해 조건을 줄이기 + 탐색 범위 좁히기, 시간 초과 실패

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
import java.util.Arrays;
 
class Solution {
    public long solution(int[] weights) {
        long answer = 0;
        
        Arrays.sort(weights);
        
        for(int i=0; i<weights.length-1; i++){
            for(int j=i+1; j<weights.length; j++){
                if(2*weights[i]<weights[j]){
                    break;
                }
                if(weights[i]==weights[j]){
                    answer++;
                    continue;
                }
                if((3*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((4*weights[i]==2*weights[j])){
                    answer++;
                    continue;
                }
                if((4*weights[i]==3*weights[j])){
                    answer++;
                    continue;
                }
            }
        }
        
        return answer;
    }
}
 
 

 

 

😮 찾아본 풀이

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
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
 
class Solution {
    
    public long solution(int[] weights) {
        long answer = 0;
 
        Map<Double, Integer> map = new HashMap<>();
 
        Arrays.sort(weights);
        
        for(int weight : weights) {
            double sameWeight = weight*1.0;
            double twoThirdWeight = (weight*2.0)/3.0;
            double halfWeight = (weight*1.0)/2.0;
            double threeQuaters = (weight*3.0)/4.0;
            if(map.containsKey(sameWeight)) answer += map.get(sameWeight);
            if(map.containsKey(twoThirdWeight)) answer += map.get(twoThirdWeight);
            if(map.containsKey(halfWeight)) answer += map.get(halfWeight);
            if(map.containsKey(threeQuaters)) answer += map.get(threeQuaters);
            map.put((weight*1.0), map.getOrDefault((weight*1.0), 0)+1);
        }
 
        return answer;
 
    }
}
 
 

1. Arrays.sort(weights)

    - weights 오름차순 정렬

2. double sameWeight, twoThirdWeight, halfWeight, threeQuaters

    - weight가 오름차순 정렬되었으므로, 앞의 값과 비교하는 for문은 현재 weight보다 작은 특정 비율을 갖고 있는지만 확인하면 됨

3. map.put((weight*1.0), map.getOrDefault((weight*1.0), 0)+1)

    - weight값을 map에 저장하되, 중복이 제거되므로 이를 해결하기 위해 value 활용

    - 마지막에 위치시켜 자기자신과 비교한 값이 검사되지 않도록 함

        - 만일 맨 위로 위치시킬 경우, 자기 자신과 sameWeight로 비교된 부분을 제거하기 위해 weights.length를 차감해야 함

 

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
class Solution {
    
    public long solution(int[] weights) {
        long answer = 0;
        
        int[] weightCount = new int[1001];
 
        for(int weight : weights){
            weightCount[weight]++;
        }
        
        for(int weight=100; weight<=1000; weight++){
            long count = weightCount[weight];
            
            if(count==0){
                continue;
            }
            
            answer += count * (count-1/ 2;
            // 동일한 값이 2개 이상일 경우
            
            if (weight * 3 % 2 == 0 && weight * 3 / 2 <= 1000) {
                answer += count * weightCount[weight * 3 / 2];
                // weight: 임의의 수 = 2 : 3
            }
            
           if (weight * 4 % 2 == 0 && weight * 4 / 2 <= 1000) {
                answer += count * weightCount[weight * 4 / 2];
               // weight: 임의의 수 = 2 : 4
            }
 
            if (weight * 4 % 3 == 0 && weight * 4 / 3 <= 1000) {
                answer += count * weightCount[weight * 4 / 3];
                // weight: 임의의 수 = 3 : 4
            }
        }
        
        return answer;
 
    }
}
 
 

1. int[] weightCount = new int[1001]

    - weight를 index로 사용하고 count를 value로 사용

2. long count = weightCount[weight]

    - count 자체를 int 범위이지만, 동일한 값의 개수를 구하기 위한 공식에서 int * int가 int의 범위를 넘어 long으로 선언

    - 또는 count간의 곱에서 casting을 할 수도 있음

        - 예: 100이 100,000개 있을 때, answer = 100,000* 99,999 > int값의 범위

3. if (weight * 3 % 2 == 0 && weight * 3 / 2 <= 1000)

    - weight * 3 % 2 == 0: weight보다 (3/2)배 더 크지만,

    - weight * 3 / 2 <= 1000: arrayIndexOutOfBoundsException 방지

 

 

 

🔗 소스 코드
GitHub

 

📚 참고 자료

 

[Java] 시소 짝꿍 - Lv2 프로그래머스

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

mag1c.tistory.com