코딩테스트 - 프로그래머스/JAVA

[프로그래머스 / 코딩테스트 입문 / 자바(JAVA)] 특이한 정렬

읁; 2024. 3. 6. 19:41

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/120880

 

프로그래머스

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

programmers.co.kr

 

 

▼ ▼ ▼

정답 풀이로 바로 가기

▲ ▲ ▲

 

 

내 풀이 (오답)

로직

  1. numlist에 있는 모든 원소들을 순회하는 for문
  2. Integer를 원소로 갖는 ArrayList 객체 answer 에 원소를 하나씩 추가한다.
    • 이 때, answer 내의 원소들을 numlist[i]와 비교한다.
    • answer.get(j)n의 차이보다 numlist[i]n의 차이가 더 크면
      • j 위치에 numlist[i]를 add한다.
      • answer 순회를 break; 한다.
    • answer.get(j)n의 차이와 numlist[i]n의 차이가 같고 (and)
      answer.get(j) 보다 numlist[i]가 더 크면
      • j 위치에 numlist[i]를 add한다.
      • answer 순회를 break; 한다.

 

코드

import java.util.*;

class Solution {
    public int[] solution(int[] numlist, int n) {

        List<Integer> answer = new ArrayList<>();

        for(int i=0; i<numlist.length; i++) {
            if(i==0) {
                answer.add(numlist[i]);
                continue;
            }

            for(int j=0; j<answer.size(); j++) {
                if(Math.abs(answer.get(j)-n) > Math.abs(numlist[i]-n)) {
                    answer.add(j, numlist[i]);
                    break;
                } else if (Math.abs(answer.get(j)-n) == Math.abs(numlist[i]-n)
                            && answer.get(j) < numlist[i]) {
                    answer.add(j, numlist[i]);
                    break;
                }
            }
        }

        return answer.stream().mapToInt(i->i).toArray();
    }
}

 

채점 결과

정확성  테스트
테스트 1 〉    실패 (2.77ms, 70.1MB)
테스트 2 〉    실패 (2.94ms, 77.4MB)
테스트 3 〉    실패 (2.64ms, 73.6MB)
테스트 4 〉    실패 (2.00ms, 77.8MB)
테스트 5 〉    통과 (1.73ms, 76.5MB)
테스트 6 〉    통과 (2.54ms, 74.3MB)
테스트 7 〉    통과 (1.81ms, 76.5MB)
채점 결과
정확성: 42.9
합계: 42.9 / 100.0

 

 


 

내 풀이 (정답)

로직

numlist(int[]) = [1, 2, 3, 4, 5]
n(int) = 1 이라는 테스트 케이스를 추가하자,
1 이외의 다른 원소들이 list에 추가되지 않는 것을 알아냈다.

비교작업 후에도 list에 add되지 않은 원소들은
마지막에 add될 수 있도록 작업이 필요하다.

  1. numlist에 있는 모든 원소들을 순회하는 for문
  2. Integer를 원소로 갖는 ArrayList 객체 answer 에 원소를 하나씩 추가한다.
    • 이 때, answer 내의 원소들을 numlist[i]와 비교한다.
    • answer.get(j)n의 차이보다 numlist[i]n의 차이가 더 크면
      • j 위치에 numlist[i]를 add한다.
      • answer 순회를 break; 한다.
    • answer.get(j)n의 차이와 numlist[i]n의 차이가 같고 (and)
      answer.get(j) 보다 numlist[i]가 더 크면
      • j 위치에 numlist[i]를 add한다.
      • answer 순회를 break; 한다.
  3. 만약 위 순회문을 돌고났는데도 answer 안에 numlist[i]가 없으면, numlist[i]를 추가해준다.

 

코드

import java.util.*;

class Solution {
    public int[] solution(int[] numlist, int n) {

        List<Integer> answer = new ArrayList<>();

        for(int i=0; i<numlist.length; i++) {
            if(i==0) {
                answer.add(numlist[i]);
                continue;
            }

            for(int j=0; j<answer.size(); j++) {
                if(Math.abs(answer.get(j)-n) > Math.abs(numlist[i]-n)) {
                    answer.add(j, numlist[i]);
                    break;
                } else if (Math.abs(answer.get(j)-n) == Math.abs(numlist[i]-n)
                            && answer.get(j) < numlist[i]) {
                    answer.add(j, numlist[i]);
                    break;
                }
            }

            if(answer.indexOf(numlist[i])==-1) answer.add(numlist[i]);
        }

        return answer.stream().mapToInt(i->i).toArray();
    }
}

 

채점 결과

정확성  테스트
테스트 1 〉    통과 (3.47ms, 75.5MB)
테스트 2 〉    통과 (3.40ms, 76.6MB)
테스트 3 〉    통과 (2.78ms, 75.4MB)
테스트 4 〉    통과 (3.11ms, 73.6MB)
테스트 5 〉    통과 (1.86ms, 71.2MB)
테스트 6 〉    통과 (1.97ms, 72.3MB)
테스트 7 〉    통과 (2.27ms, 73.1MB)
채점 결과
정확성: 100.0
합계: 100.0 / 100.0