문제 설명

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

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

'(' 또는 ')' 로만 이루어진 문자열 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번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

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