문제 설명

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

  • ()() 또는 (())() 는 올바른 괄호입니다.
  • )()( 또는 (()( 는 올바르지 않은 괄호입니다.

'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항

  • 문자열 s의 길이 : 100,000 이하의 자연수
  • 문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예

sanswer

()() true
(())() true
)()( false
(()( false

입출력 예 설명

입출력 예 #1,2,3,4
문제의 예시와 같습니다.

 

 boolean solution(String s) {
        boolean answer = false;
        char[] chars = s.toCharArray();

        Stack stack = new Stack();

        if(chars[0] == ')')
        {
            return answer;
        }

        for (char i : chars
        ) {
            if(i == '(')
            {
                stack.push(i);
            }
            else if (i == ')' && !stack.isEmpty())
            {
                stack.pop();
            }
        }
        if(stack.empty())
        {
            answer = true;
            return answer;
        }
        else
        {
            return answer;
        }
    }

 

처음에는 ArrayList를 이용하여 풀었으나, 효율성 테스트에서 떨어졌다. 그 이후 스택을 사용하는 방법으로 변경하고,

처음부터 닫는 괄호가 나올경우 무조건 올바른 괄호가 나올 수 없으므로 그에대한 처리 후에, 여는 괄호가 나올 경우 스택에 추가하고 닫는 괄호가 나올 경우 스택에 추가했던 여는 괄호를 삭제한다. 이 과정이 끝난 후에 스택에 값이 남아있을 경우, 올바른 괄호가 아니고, 스택이 비어있을 경우 올바른 괄호이다!

문제 설명

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

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

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

선행 스킬 순서 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. 스킬 트리: 유저가 스킬을 배울 순서 

 

public class SkillTree {

    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        ArrayList<String> array = new ArrayList<>();
        for (int i = 0; i < skill_trees.length; i++)
        {
            String str = "";
            for(int j = 0; j < skill_trees[i].length(); j++) {

                for (int k = 0; k < skill.length(); k++) {
                    if (skill.charAt(k) == skill_trees[i].charAt(j)) {
                        str += skill.charAt(k);
                    }
                }
            }
            array.add(str);
            System.out.println("결과는 " + str);
        }
        for(int i = 0; i < array.size(); i++)
        {
            int[] answers = new int[array.size()];
            answers[i] = 1;
            for (int j = 0; j < array.get(i).length(); j++)
            {
                if (array.get(i).charAt(j) != skill.charAt(j))
                {
                    System.out.println(skill_trees[i] + ":" + array.get(i).charAt(j) + "스킬을 배우기전에 "
                            + skill.charAt(j) + "스킬을 먼저 배워야 합니다.");
                    answers[i] = 0;
                    break;
                }
            }
            if (answers[i] == 1)
            {
                answer++;
            }
        }
        System.out.println("정답 수는" + answer);
        return answer;
    }

    public static void main(String[] args)
    {

        SkillTree s = new SkillTree();
        s.solution("CBD",new String[]{"BACDE","CBADF","AECB","BDA"});
    }


}


 

 

 

 

프로그래머스

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

programmers.co.kr

 

 

상금 헌터 성공

시간 제한메모리 제한제출정답맞은 사람정답 비율

1 초 (추가 시간 없음) 512 MB 9761 3349 2855 36.758%

문제

2017년에 이어, 2018년에도 카카오 코드 페스티벌이 개최된다!

카카오 코드 페스티벌에서 빠질 수 없는 것은 바로 상금이다. 2017년에 개최된 제1회 코드 페스티벌에서는, 본선 진출자 100명 중 21명에게 아래와 같은 기준으로 상금을 부여하였다.

순위상금인원

1등 500만원 1명
2등 300만원 2명
3등 200만원 3명
4등 50만원 4명
5등 30만원 5명
6등 10만원 6명

2018년에 개최될 제2회 코드 페스티벌에서는 상금의 규모가 확대되어, 본선 진출자 64명 중 31명에게 아래와 같은 기준으로 상금을 부여할 예정이다.

순위상금인원

1등 512만원 1명
2등 256만원 2명
3등 128만원 4명
4등 64만원 8명
5등 32만원 16명

제이지는 자신이 코드 페스티벌에 출전하여 받을 수 있을 상금이 얼마인지 궁금해졌다. 그는 자신이 두 번의 코드 페스티벌 본선 대회에서 얻을 수 있을 총 상금이 얼마인지 알아보기 위해, 상상력을 발휘하여 아래와 같은 가정을 하였다.

  • 제1회 코드 페스티벌 본선에 진출하여 a등(1 ≤ a ≤ 100)등을 하였다. 단, 진출하지 못했다면 a = 0으로 둔다.

  • 제2회 코드 페스티벌 본선에 진출하여 b등(1 ≤ b ≤ 64)등을 할 것이다. 단, 진출하지 못했다면 b = 0으로 둔다.

제이지는 이러한 가정에 따라, 자신이 받을 수 있는 총 상금이 얼마인지를 알고 싶어한다.

입력

첫 번째 줄에 제이지가 상상력을 발휘하여 가정한 횟수 T(1 ≤ T ≤ 1,000)가 주어진다.

다음 T개 줄에는 한 줄에 하나씩 제이지가 해본 가정에 대한 정보가 주어진다. 각 줄에는 두 개의 음이 아닌 정수 a(0 ≤ a ≤ 100)와 b(0 ≤ b ≤ 64)가 공백 하나를 사이로 두고 주어진다.

출력

각 가정이 성립할 때 제이지가 받을 상금을 원 단위의 정수로 한 줄에 하나씩 출력한다. 입력이 들어오는 순서대로 출력해야 한다.

예제 입력 1 복사

6 8 4 13 19 8 10 18 18 8 25 13 16

예제 출력 1 복사

1780000 620000 1140000 420000 820000 620000

출처

Contest > 카카오 코드 페스티벌 > 카카오 코드 페스티벌 2018 예선 A번

 

package com.company;

import java.util.Scanner;

public class BaekJoon15953 {
    public static void main(String[] args) {
        int count;
        Scanner scanner = new Scanner(System.in);

        count = scanner.nextInt();
        int[] printSum = new int[count];
        if(count <= 1000 && count >= 0)
        {
            for(int i = 0; i < count; i++)
            {
                int first;
                int second;
                int sum = 0;

                first = scanner.nextInt();
                second = scanner.nextInt();

                if (first >= 0 && first <= 100)
                {
                    if (first == 0 ) { }
                    else if (first == 1 ) { sum += 5000000; }
                    else if (first <= 3) { sum += 3000000; }
                    else if (first <= 6) { sum += 2000000; }
                    else if (first <= 10) { sum += 500000; }
                    else if (first <= 15) { sum += 300000; }
                    else if (first <= 21) { sum += 100000; }
                    else if (first >= 22 ) { }
                }
                if (second >= 0 && second <= 64)
                {
                    if (second == 0) {  }
                    else if (second == 1) { sum += 5120000; }
                    else if (second <= 3) { sum += 2560000; }
                    else if (second <= 7) { sum += 1280000; }
                    else if (second <= 15) { sum += 640000; }
                    else if (second <= 31) { sum += 320000; }
                    else if (second >= 32 ) { }
                }
                printSum[i] = sum;

            }
            for(int i = 0; i < printSum.length; i++)
            {
                System.out.println(printSum[i]);
            }
        }
    }
}

 테스트 케이스 대로 실행했는데 계속 틀리다고 나와서 1 0 0 입력해보니 0이아닌 다른 값이 나왔었다.

0일 경우를 처리해주니 바로 정답처리되었다.

문제 설명

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 시험은 최대 10,000 문제로 구성되어있습니다.
  • 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
  • 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.

입출력 예

answersreturn

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

입출력 예 설명

입출력 예 #1

  • 수포자 1은 모든 문제를 맞혔습니다.
  • 수포자 2는 모든 문제를 틀렸습니다.
  • 수포자 3은 모든 문제를 틀렸습니다.

따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.

입출력 예 #2

  • 모든 사람이 2문제씩을 맞췄습니다.
import java.util.ArrayList;

public class FirstSearch1 {
    public int[] solution(int[] answers) {


        int[] arr1 = {1,2,3,4,5};
        int[] arr2 = {2,1,2,3,2,4,2,5};
        int[] arr3 = {3,3,1,1,2,2,4,4,5,5};

        int[] cnt = new int[3];

        for(int i = 0; i < answers.length; i++)
        {
            if(answers[i] == arr1[i%5])
            {
                cnt[0]++;
            }
            if(answers[i] == arr2[i%8])
            {
                cnt[1]++;
            }
            if(answers[i] == arr3[i%10])
            {
                cnt[2]++;
            }
        }
        int max = Math.max(Math.max(cnt[0], cnt[1]),cnt[2]); // max값 구하기
        ArrayList<Integer> list = new ArrayList<Integer>();

        if(max==cnt[0]) list.add(1);
        if(max==cnt[1]) list.add(2);
        if(max==cnt[2]) list.add(3);

        int[] answer = new int[list.size()];

        for(int i =0; i<answer.length; i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }

    public static void main(String[] args) {
        FirstSearch1 firstSearch1 = new FirstSearch1();
        int[] arr = firstSearch1.solution(new int[]{1,2,3,4,5});
        for(int i = 0; i < arr.length; i++)
        {
            System.out.println(arr[i]);
        }

    }
}

문제 설명

 

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

arraycommandsreturn

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.

 

 

 

import java.util.Arrays;

public class Sort1 {
    public int[] solution(int[] array, int[][] commands) {

        int[] answer = new int[commands.length]; // commands의 길이에 따라 정답의 길이가 정해짐
        for(int i =0; i < commands.length; i++)
        {
            int[] arr = Arrays.copyOfRange(array,commands[i][0]-1,commands[i][1]); // i부터 j까지 배열을 생성
            Arrays.sort(arr); // 생성한 배열을 정렬해주고
            answer[i] = arr[commands[i][2]-1]; // 정답 배열의 i 번째 인덱스에 생성한 배열의 commands의 k번째 값 을 넣어준다
        }


        return answer;
    }

    public static void main(String[] args) {
        Sort1 s = new Sort1();

        int[] a = s.solution(new int[]{1,5,2,6,3,7,4},new int[][]{{2,5,3,},{4,4,1},{1,7,3}});

    }

}

 

비교적 간단하게 풀었던 문제입니다 Arrays 클래스의 편리한 기능을 사용하여 쉽게 풀었습니다.

+ Recent posts