posted by 코딩 공부중 2020. 6. 2. 12:42

문제 설명

게임개발자인 죠르디는 크레인 인형뽑기 기계를 모바일 게임으로 만들려고 합니다.
죠르디는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다.

게임 화면은 1 x 1 크기의 칸들로 이루어진 N x N 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 5 x 5 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 1 x 1 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 칸부터 인형이 순서대로 쌓이게 됩니다. 다음 그림은 [1번, 5번, 3번] 위치에서 순서대로 인형을 집어 올려 바구니에 담은 모습입니다.

만약 같은 모양의 인형 두 개가 바구니에 연속해서 쌓이게 되면 두 인형은 터뜨려지면서 바구니에서 사라지게 됩니다. 위 상태에서 이어서 [5번] 위치에서 인형을 집어 바구니에 쌓으면 같은 모양 인형 두 개가 없어집니다.

크레인 작동 시 인형이 집어지지 않는 경우는 없으나 만약 인형이 없는 곳에서 크레인을 작동시키는 경우에는 아무런 일도 일어나지 않습니다. 또한 바구니는 모든 인형이 들어갈 수 있을 만큼 충분히 크다고 가정합니다. (그림에서는 화면표시 제약으로 5칸만으로 표현하였음)

게임 화면의 격자의 상태가 담긴 2차원 배열 board와 인형을 집기 위해 크레인을 작동시킨 위치가 담긴 배열 moves가 매개변수로 주어질 때, 크레인을 모두 작동시킨 후 터트려져 사라진 인형의 개수를 return 하도록 solution 함수를 완성해주세요.

[제한사항]

  • board 배열은 2차원 배열로 크기는 5 x 5 이상 30 x 30 이하입니다.
  • board의 각 칸에는 0 이상 100 이하인 정수가 담겨있습니다.
    • 0은 빈 칸을 나타냅니다.
    • 1 ~ 100의 각 숫자는 각기 다른 인형의 모양을 의미하며 같은 숫자는 같은 모양의 인형을 나타냅니다.
  • moves 배열의 크기는 1 이상 1,000 이하입니다.
  • moves 배열 각 원소들의 값은 1 이상이며 board 배열의 가로 크기 이하인 자연수입니다.

입출력 예

boardmovesresult

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

입출력 예에 대한 설명

입출력 예 #1

인형의 처음 상태는 문제에 주어진 예시와 같습니다. 크레인이 [1, 5, 3, 5, 1, 2, 1, 4] 번 위치에서 차례대로 인형을 집어서 바구니에 옮겨 담은 후, 상태는 아래 그림과 같으며 바구니에 담는 과정에서 터트려져 사라진 인형은 4개 입니다.

 

스택을 이용해 문제풀이

 

 

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
class Solution {
    public int solution(int[][] board, int[] moves) {
        int answer = 0;
        
        int tmp = 0;
        
        Stack<Integer> stack = new Stack<>();
        
        for(int i=0; i<moves.length; i++) {
            tmp = moves[i];
            for(int j=0; j<board.length; j++) {
                if(board[j][tmp-1!=0) {
                    if(stack.size() >0) {
                        if(stack.peek() == board[j][tmp-1]) {
                            answer = answer + 2;
                            stack.pop();    //스택 값 제거
                        }else{
                            stack.push(board[j][tmp-1]);
                        }
                    }else {
                        stack.push(board[j][tmp-1]);
                    }
                    
                    board[j][tmp-1= 0;
                    break;
                }
            }        
            
        }
        
        return answer;
    }
}
cs
posted by 코딩 공부중 2020. 6. 2. 12:03

자바 jsoup 라이브러리를 활용한 다음 스포츠뉴스 크롤링 코드

 

 

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
public class daumNewsTop {
    private static String address = "https://sports.media.daum.net/sports/";
    
    public static void main(String[] args) throws IOException {
        
        String korea = "soccer";    //국내축구
        String world = "worldsoccer";    //해외축구
        
        String rank = "news/ranking";
        
        address = address + korea + rank;
        
        Document doc = Jsoup.connect(address).get();
        
        Elements titles = doc.select("ol.list_news");    //타이틀 가져오기
        ArrayList<String> list = new ArrayList<>();    //타이틀 저장한 리스트x
        
        System.out.println(titles.size());
        
        for(Element title : titles){    //타이틀 리스트에 저장
            String t = title.text();
            list.add(t);
        }
        
 
    }
 
}
cs
posted by 코딩 공부중 2020. 5. 5. 20:38

hash를 사용하라는 문제였으나 다른 방법으로 풀이함

 

문제 설명

전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.

  • 구조대 : 119
  • 박준영 : 97 674 223
  • 지영석 : 11 9552 4421

전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • phone_book의 길이는 1 이상 1,000,000 이하입니다.
  • 각 전화번호의 길이는 1 이상 20 이하입니다.

입출력 예제

phone_bookreturn

[119, 97674223, 1195524421] false
[123,456,789] true
[12,123,1235,567,88] false

입출력 예 설명

입출력 예 #1
앞에서 설명한 예와 같습니다.

입출력 예 #2
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.

입출력 예 #3
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.


알림

2019년 5월 13일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
 
class Solution {
    public boolean solution(String[] phone_book) {
        boolean answer = true;
        Arrays.sort(phone_book);
       for(int i=0; i<phone_book.length; i++) {
            for(int j=i+1; j<phone_book.length; j++) {
                if(phone_book[j].startsWith(phone_book[i])) {
                    answer= false;
                }
            }
        }
        return answer;
    }
}
cs
posted by 코딩 공부중 2020. 5. 5. 20:36

문제 설명

124 나라가 있습니다. 124 나라에서는 10진법이 아닌 다음과 같은 자신들만의 규칙으로 수를 표현합니다.

  1. 124 나라에는 자연수만 존재합니다.
  2. 124 나라에는 모든 수를 표현할 때 1, 2, 4만 사용합니다.

예를 들어서 124 나라에서 사용하는 숫자는 다음과 같이 변환됩니다.

10진법124 나라10진법124 나라

1 1 6 14
2 2 7 21
3 4 8 22
4 11 9 24
5 12 10 41

자연수 n이 매개변수로 주어질 때, n을 124 나라에서 사용하는 숫자로 바꾼 값을 return 하도록 solution 함수를 완성해 주세요.

제한사항

  • n은 500,000,000이하의 자연수 입니다.

입출력 예

nresult

1 1
2 2
3 4
4 11

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
    public String solution(int n) {
        String answer = "";
        int tmp = 0;
        
        while(n>0) {
            tmp = n%3;
            n=n/3;
            
            if(tmp == 0) {
                tmp = 4;
                n=n-1;
            }
            
            
            answer= tmp+answer;
        }
        return answer;
    }
}
cs
posted by 코딩 공부중 2020. 4. 17. 12:07

스택/큐 활용 문제

 

문제 설명

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다.
※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다.

예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.

경과 시간다리를 지난 트럭다리를 건너는 트럭대기 트럭

0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리 길이 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

제한 조건

  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.

입출력 예

bridge_lengthweighttruck_weightsreturn

2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

출처

※ 공지 - 2020년 4월 06일 테스트케이스가 추가되었습니다.

 

 

 

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
class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;
        
        Queue<Integer> bridge_q = new LinkedList<Integer>();    //다리 위에 있는 트럭
        int[] endTime = new int[truck_weights.length];    //각각의 트럭 종료시간을 저장할 배열
        int wating = 0;    //대기중인 트럭의 인덱스 값을 넣어줄 변수
        
        while(true) {
            answer++;    //트럭이 진입하면서 시간 경과
            
            if(!bridge_q.isEmpty()) {    //다리위에 트럭이 있는 경우
                if(endTime[bridge_q.peek()] == answer) {    //끝나는 시간을 모아둔 배열에서 현재 다리에 있는 트럭의 시간이 트럭이 나갈때까지 소모되는 시간과 같은지 확인한다.
                    weight = weight + truck_weights[bridge_q.poll()];    //if문에 해당하는 경우, 전체 무게에서 빠져나간 무게를 다시 더해준다(무게를 원래대로 복구)
                }
            }
            
            if(wating < truck_weights.length) {//wating은 대기중인 배열의위치이므로, 이값이 대기트럭 배열의 길이보다 작아야 다음 트럭이 있다는 뜻 
                if(truck_weights[wating] <= weight) { //대기중인 트럭의 무게가 현재무게보다 작거나 같은지 비교한다.
                    bridge_q.add(wating);    //if문에 해당하면 대기중인 트럭이 다리위로 올라간다
                    endTime[wating] = answer + bridge_length;    //트럭이 나갈때까지 소모되는 시간을 추가해준다. 다리의 길이만큼
                    weight = weight - truck_weights[wating];    //weight에서 무게를 빼준다.
                    wating++;    //다음 트럭
                }
            }
            if(bridge_q.isEmpty()) {            //다리 위에 트럭이 없으면 빠져나간다.
                break;
            }
        }
        
        return answer;
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)전화번호 목록  (0) 2020.05.05
(프로그래머스)124나라의 숫자  (0) 2020.05.05
(프로그래머스)쇠막대기  (0) 2020.04.17
(프로그래머스)스킬트리  (0) 2020.04.17
(프로그래머스)기능개발  (0) 2020.04.17
posted by 코딩 공부중 2020. 4. 17. 12:03

스택/큐를 활용하는 문제

 

여러 개의 쇠막대기를 레이저로 절단하려고 합니다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자릅니다. 쇠막대기와 레이저의 배치는 다음 조건을 만족합니다.

- 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있습니다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓습니다. - 각 쇠막대기를 자르는 레이저는 적어도 하나 존재합니다. - 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않습니다.

아래 그림은 위 조건을 만족하는 예를 보여줍니다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향입니다.

이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있습니다.

(a) 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 '()'으로 표현합니다. 또한 모든 '()'는 반드시 레이저를 표현합니다. (b) 쇠막대기의 왼쪽 끝은 여는 괄호 '('로, 오른쪽 끝은 닫힌 괄호 ')'로 표현됩니다.

위 예의 괄호 표현은 그림 위에 주어져 있습니다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘리는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘리고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘립니다.

쇠막대기와 레이저의 배치를 표현한 문자열 arrangement가 매개변수로 주어질 때, 잘린 쇠막대기 조각의 총 개수를 return 하도록 solution 함수를 작성해주세요.

제한사항

  • arrangement의 길이는 최대 100,000입니다.
  • arrangement의 여는 괄호와 닫는 괄호는 항상 쌍을 이룹니다.

입출력 예

arrangementreturn

()(((()())(())()))(()) 17

입출력 예 설명

문제에 나온 예와 같습니다.

출처

불러오는 중입니다...

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
    public int solution(String arrangement) {
        int answer = 0;
        Stack<String> stack = new Stack<>();
        
         for(int i=0; i<arrangement.length(); i++) {
            if(arrangement.charAt(i)=='(') {
                if(i+1 < arrangement.length() && arrangement.charAt(i+1)=='(') {
                    stack.push("(");
                }else if(i+1 < arrangement.length() && arrangement.charAt(i+1)==')'){        //레이저
                    answer = answer + stack.size();
                }
            }else {
                if(i+1 < arrangement.length() && arrangement.charAt(i+1)==')') {
                    stack.pop();
                    answer++;
                }
            }
        }
        return answer;
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)124나라의 숫자  (0) 2020.05.05
(프로그래머스)다리를 지나는 트럭  (0) 2020.04.17
(프로그래머스)스킬트리  (0) 2020.04.17
(프로그래머스)기능개발  (0) 2020.04.17
(프로그래머스)주식가격  (0) 2020.04.17
posted by 코딩 공부중 2020. 4. 17. 12:02

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

제한 조건

  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 CBD로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

입출력 예

skillskill_treesreturn

"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

입출력 예 설명

  • BACDE: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • CBADF: 가능한 스킬트리입니다.
  • AECB: 가능한 스킬트리입니다.
  • BDA: B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

  1. 스킬 트리: 유저가 스킬을 배울 순서 

 

프로그래머스

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

programmers.co.kr

 

 

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
class Solution {
    public int solution(String skill, String[] skill_trees) {
        char[] check = new char[skill.length()];
        int answer =  skill_trees.length;
        int tmp = 0;
        int current = 0;
        for(int i =0; i<check.length; i++) {
            check[i] = skill.charAt(i);
        }
        
        for(int i=0; i<skill_trees.length; i++) {
            tmp = skill_trees[i].indexOf(check[0]);
            
            for(int j=1; j<check.length; j++) {
                current = skill_trees[i].indexOf(check[j]);
                if(current != -1 && tmp > current || tmp == -1) {
                    answer--;
                    break;
                }
                tmp = current;
            }
        }
        return answer;
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)다리를 지나는 트럭  (0) 2020.04.17
(프로그래머스)쇠막대기  (0) 2020.04.17
(프로그래머스)기능개발  (0) 2020.04.17
(프로그래머스)주식가격  (0) 2020.04.17
(프로그래머스)프린터  (0) 2020.04.17
posted by 코딩 공부중 2020. 4. 17. 12:01

스택/큐를 활용하는 문제

 

문제 설명

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

제한 사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

입출력 예

progressesspeedsreturn

[93,30,55] [1,30,5] [2,1]

입출력 예 설명

첫 번째 기능은 93% 완료되어 있고 하루에 1%씩 작업이 가능하므로 7일간 작업 후 배포가 가능합니다.
두 번째 기능은 30%가 완료되어 있고 하루에 30%씩 작업이 가능하므로 3일간 작업 후 배포가 가능합니다. 하지만 이전 첫 번째 기능이 아직 완성된 상태가 아니기 때문에 첫 번째 기능이 배포되는 7일째 배포됩니다.
세 번째 기능은 55%가 완료되어 있고 하루에 5%씩 작업이 가능하므로 9일간 작업 후 배포가 가능합니다.

따라서 7일째에 2개의 기능, 9일째에 1개의 기능이 배포됩니다.

 

 

 

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
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] days = new int[speeds.length];
        Queue<Integer> q = new LinkedList<Integer>();
        ArrayList<Integer> count = new ArrayList<>();
        
        for(int i=0; i<progresses.length; i++) {
            while(progresses[i]<100) {
                progresses[i] = progresses[i] + speeds[i];
                days[i]++;
            }
        }
        
        for(int i=0; i<days.length; i++) {
            q.offer(days[i]);
        }
        
        int tmp = 0;
        int add = 1;
        tmp = q.poll();
        while(q.isEmpty()==false) {
            
            if(tmp >= q.peek()) {
                q.poll();
                add++;
            }else {
                count.add(add);
                add = 1;
                tmp = q.poll();
            }
        }
        count.add(add);
        
        
        int[] answer = new int[count.size()];
        
        for(int i=0; i<answer.length; i++) {
            answer[i] = count.get(i);
        }
        
        return answer;
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)쇠막대기  (0) 2020.04.17
(프로그래머스)스킬트리  (0) 2020.04.17
(프로그래머스)주식가격  (0) 2020.04.17
(프로그래머스)프린터  (0) 2020.04.17
(프로그래머스)탑  (0) 2020.03.25
posted by 코딩 공부중 2020. 4. 17. 12:00

스택/큐 활용 문제

문제 설명

초 단위로 기록된 주식가격이 담긴 배열 prices가 매개변수로 주어질 때, 가격이 떨어지지 않은 기간은 몇 초인지를 return 하도록 solution 함수를 완성하세요.

제한사항

  • prices의 각 가격은 1 이상 10,000 이하인 자연수입니다.
  • prices의 길이는 2 이상 100,000 이하입니다.

입출력 예

pricesreturn

[1, 2, 3, 2, 3] [4, 3, 1, 1, 0]

입출력 예 설명

  • 1초 시점의 ₩1은 끝까지 가격이 떨어지지 않았습니다.
  • 2초 시점의 ₩2은 끝까지 가격이 떨어지지 않았습니다.
  • 3초 시점의 ₩3은 1초뒤에 가격이 떨어집니다. 따라서 1초간 가격이 떨어지지 않은 것으로 봅니다.
  • 4초 시점의 ₩2은 1초간 가격이 떨어지지 않았습니다.
  • 5초 시점의 ₩3은 0초간 가격이 떨어지지 않았습니다.

※ 공지 - 2019년 2월 28일 지문이 리뉴얼되었습니다.

 

 

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
import java.util.LinkedList;
import java.util.Queue;
 
class Solution {
    public int[] solution(int[] prices) {
        int count = 0;
        Queue<Integer> q = new LinkedList<Integer>();
        
        for(int i=0; i<prices.length; i++) {
            count = 0;
            for(int j=i+1; j<prices.length; j++) {
                count++;
                if(prices[i] > prices[j]){
                    break;
                }
                
            }
            q.add(count);
        }
        
        int[] answer = new int[prices.length];
        
        for(int i=0; i<answer.length; i++) {
            answer[i] = q.poll();
        }
        
        return answer;
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)스킬트리  (0) 2020.04.17
(프로그래머스)기능개발  (0) 2020.04.17
(프로그래머스)프린터  (0) 2020.04.17
(프로그래머스)탑  (0) 2020.03.25
(프로그래머스)자릿수 더하기  (0) 2020.03.20
posted by 코딩 공부중 2020. 4. 17. 11:51

스택/큐를 활용하는 문제

 

문제 설명

일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다. 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.

예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.

내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.

현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
  • 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
  • location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.

입출력 예

prioritieslocationreturn

[2, 1, 3, 2] 2 1
[1, 1, 9, 1, 1, 1] 0 5

입출력 예 설명

예제 #1

문제에 나온 예와 같습니다.

예제 #2

6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.

출처

불러오는 중입니다...

 

 

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
class Solution {
    public int solution(int[] priorities, int location) {
        int max = 0;
        int tmp = 0;
        int answer = 0;
        
        PriorityQueue<Integer> q = new PriorityQueue<Integer>(Collections.reverseOrder());
        Deque<Integer> dq = new ArrayDeque<>();
        
        for(int i=0; i<priorities.length; i++) {
            q.add(priorities[i]);
            
        }
        
        for(int i=0; i<priorities.length; i++) {
            dq.add(priorities[i]);
        }
        
        max = q.poll();
        
        while(!q.isEmpty()) {
            if(dq.peek()<max) {
                tmp = dq.pollFirst();
                dq.addLast(tmp);
                location--;
                if(location <0) {
                    location = dq.size()-1;
                }
            }else {
                answer++;
                location--;
                if(location==-1) {
                    return answer;
                }
                max=q.poll();
                dq.pollFirst();
            }
        }
        answer++;
        return answer;
        
    }
}
cs

'java' 카테고리의 다른 글

(프로그래머스)기능개발  (0) 2020.04.17
(프로그래머스)주식가격  (0) 2020.04.17
(프로그래머스)탑  (0) 2020.03.25
(프로그래머스)자릿수 더하기  (0) 2020.03.20
(프로그래머스)정수 뒤집어 배열 만들기  (0) 2020.03.20