[프로그래머스] 11: k번째 수 | 두 개 뽑아서 더하기 | 가장 가까운 같은 글자

서예진·2024년 1월 23일
0
post-custom-banner

목차

▸ k번째 수
▸ 두 개 뽑아서 더하기
▸ 가장 가까운 같은 글자


▸ k번째 수 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 정렬 > k번째 수

▼ 내 풀이

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int length = commands.length;
        int[] answer = new int[length];
        
        for(int n = 0; n < commands.length; n++){
            int i = commands[n][0];
            int j = commands[n][1];
            int k = commands[n][2];
            
            List<Integer> list = new ArrayList<>();
            for(int a = i-1; a <= j-1; a++){
                list.add(array[a]);
            }
            Collections.sort(list);
            answer[n] = list.get(k-1);
            list.clear();
        }
        
        return answer;
    }
}
  • 먼저 i부터 j까지의 수를 담기 위해서는 리스트가 적합하다고 생각했다.
  • commands의 행별로 반복해야하기 때문에 반복문을 고려했다.
  • 반복문 마다 i와 j, k를 저장한다.
  • 다시 반복문을 실행하여 리스트에 값을 추가한다.
    ❗️ index를 고려하여 int a의 범위를 잘 설정해야했다.

▸ 두 개 뽑아서 더하기 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 월간 코드 챌린지 시즌1 > 두 개 봅아서 더하기

▼ 내 풀이

import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

class Solution {
    public int[] solution(int[] numbers) {
        List<Integer> list = new ArrayList<>();
        
        for(int i = 0; i < numbers.length-1; i++){
            for(int j = i+1; j < numbers.length; j++){
                int result = numbers[i] + numbers[j];
                if(list.contains(result)){
                    continue;
                }
                list.add(result);
            }
        }
        Collections.sort(list);
        int[] answer = new int[list.size()];
        for(int i = 0 ; i < answer.length; i++){
            answer[i] = list.get(i);
        }
        return answer;
    }
}
  • 이중 for문을 고려했다.
  • 이중 for문을 돌면서 값을 저장해야하기 때문에 고정적인 array보다는 list를 활용했다.
  • 또한 리스트안에 중복된 값이 없도록 하기 위해 if문과 cotinue를 활용했다.

▸ 가장 가까운 같은 글자 : Lv.1

▼ 문제

출처: 프로그래머스 코딩테스트 연습 > 연습문제 > 가장 가까운 같은 글자

▼ 내 풀이

[오답 코드]
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(String s) {
        char[] charArray = s.toCharArray();
        int length = charArray.length;
        int[] answer = new int[length];
        List<Character> list = new ArrayList<>();
        
        for(int i = 0; i < length; i++){
            if(list.contains(charArray[i])){
                int index = list.indexOf(charArray[i]);
                list.add(charArray[i]);
                answer[i] = i - index;
            } else {
                list.add(charArray[i]);
                answer[i] = -1;
            }
        }
        
        return answer;
    }
}
  • 우선 문자열의 문자별로 리스트에 저장한다.
  • 리스트의 contains 메서드를 활용하는 것을 고려했다.
  • 반복문을 돌면서 리스트 안에 해당 문자가 있을 경우, 그 문자의 index를 가져와서 현재 i-index를 answer 배열에 저장하고자 했다.
  • 해당 문자가 없을 경우는 -1을 저장했다.
  • 그렇게 완성된 코드를 돌렸더니 "banana"에서 맨 끝 'a'가 2가 나와야하는데 4가 나왔다.
  • 아무래도 내가 작성한 코드의 int index = list.indexOf(charArray[i]); 이 부분에서 나는 index = 3을 가져와야하는데 1을 가져오는 것 같다.
  • 앞에서부터 읽어서 가져온 index와 뒤에서부터 읽어서 가져온 index 중 큰 값을 index로 사용하는 것은 어떨까 생각했다.
  • 근데 그렇게 해도 'banana"의 경우 'a'가 두 경우 다 2로 나오기 때문에 적합하지 않은 방법이다.
  • 그렇기 때문에 문자열의 문자를 저장하는 리스트에 문자열의 다음 문자를 포함한 경우, 한번 더 반복문을 돌려 index를 가져오게 했다.
[수정 코드]
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(String s) {
        char[] charArray = s.toCharArray();
        int length = charArray.length;
        int[] answer = new int[length];
        List<Character> list = new ArrayList<>();
        int index = 0; 
        
        for(int i = 0; i < length; i++){
            if(list.contains(charArray[i])){
                for(int j = 0; j < list.size(); j++){
                    if(list.get(j).equals(charArray[i])){
                        index = j;
                    }
                }
                list.add(charArray[i]);
                answer[i] = i - index;
            } else {
                list.add(charArray[i]);
                answer[i] = -1;
            }
        }
        
        return answer;
    }
}


❗️ 코드를 실행했더니 시간이 오래걸리는 것 같다. 해당 코드의 실행 시간을 더 줄이는 방향으로 코드를 수정해야겠다고 생각했다.

profile
안녕하세요
post-custom-banner

0개의 댓글