algorithm/프로그래머스

[프로그래머스] 모의고사 / 가장 큰 수 (07.11)

자바왕세자 2020. 7. 11. 01:47

문제

https://programmers.co.kr/learn/courses/30/lessons/42840

 

코딩테스트 연습 - 모의고사

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

programmers.co.kr

 

접근법

Level 1 문제여서 간단한 문제였다.

우선 수포자들이 찍는 번호가 지정이 되어있으므로 배열로 처리하여 반복문을 사용해야한다고 생각하였다.

반복되는 규칙과 규칙의 길이가 다른 부분을 어떻게 처리해주느냐가 가장 중요한 부분이었다고 생각한다.

 

코드

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

class Solution {
    public int[] solution(int[] answers) {
        int[] answer = {};

        int first[] = {1,2,3,4,5};
        int second[] = {2,1,2,3,2,4,2,5};
        int third[] = {3,3,1,1,2,2,4,4,5,5};
        int cnt[] = new int[4];

        for(int i=0;i<answers.length;i++){
            int solve = answers[i];
            if(first[i%first.length] == solve)
                cnt[1] ++;
            if(second[i%second.length] == solve)
                cnt[2] ++;
            if(third[i%third.length] == solve)
                cnt[3] ++;

        }

        int max = Math.max(cnt[1], Math.max(cnt[2], cnt[3]));

        List<Integer> list = new LinkedList<>();
        for(int i=1;i<cnt.length;i++){
            if(cnt[i] == max)
                list.add(i);
        }

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

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

        Arrays.sort(answer);

        return answer;
    }
}

 

 

 

문제

https://programmers.co.kr/learn/courses/30/lessons/42746

 

코딩테스트 연습 - 가장 큰 수

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 ��

programmers.co.kr

 

접근법

처음에는 단순히 정수들을 문자열로 바꾸고 정렬을 하면 될 것이라고 생각하고 코드를 짰다.

위 코드의 문제점은 맨 앞자리가 같은 숫자가 존재할 때 발생하였다.

입출력 예에서 보았을 때 30과 3은 303 또는 330으로 합쳐질 수가 있다. 근데 단순히 문자열을 역순으로 정렬하였을 경우에는 30 3 순으로 정렬이 되기 때문에 까다로웠다.

그래서 정렬을 할때 JAVA8의 람다식을 사용하여서 두 문자열을 붙여보았을 때를 비교하여 정렬하였다.

마지막으로 Test Case 하나가 틀렸는데

만약 입력이 {0, 0, 0, 0}이 되었을 경우 답이 0000이 나오는 경우가 발생하여서 그 부분을 수정하였다.

 

코드

import java.util.Arrays;

class Solution {
    public String solution(int[] numbers) {
        StringBuilder answer = new StringBuilder();

        String[] numStr = new String[numbers.length];

        for(int i=0;i<numbers.length;i++){
            numStr[i] = String.valueOf(numbers[i]);
        }

       Arrays.sort(numStr, (o1, o2) -> String.valueOf(Long.parseLong(o1+o2))
                       .compareTo(String.valueOf(Long.parseLong(o2+o1))));
        int cnt =0;
        for(int i=numStr.length-1;i>=0;i--) {
            answer.append(numStr[i]);
            if(numStr[i].equals("0"))
                cnt++;
        }

        if(cnt == numStr.length)
            return "0";

        return answer.toString();
    }
}