반응형

문제 설명

양의 정수 n이 매개변수로 주어집니다. n × n 배열에 1부터 n2 까지 정수를 인덱스 [0][0]부터 시계방향 나선형으로 배치한 이차원 배열을 return 하는 solution 함수를 작성해 주세요.


제한사항

  • 1 ≤ n ≤ 30

입출력 예

 

n result
4 [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]
5 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]

 


입출력 예 설명

 

입출력 예 #1

  • 예제 1번의 n의 값은 4로 4 × 4 배열에 다음과 같이 1부터 16까지 숫자를 채울 수 있습니다.
행\열 0 1 2 3
0 1 2 3 4
1 12 13 14 5
2 11 16 15 6
3 10 9 8 7

 

입출력 예 #2

  • 예제 2번의 n의 값은 5로 5 × 5 배열에 다음과 같이 1부터 25까지 숫자를 채울 수 있습니다.
행\열 0 1 2 3 4
0 1 2 3 4 5
1 16 17 18 19 6
2 15 24 25 20 7
3 14 23 22 21 8
4 13 12 11 10 9

 

따라서 [[1, 2, 3, 4, 5], [16, 17, 18, 19, 6], [15, 24, 25, 20, 7], [14, 23, 22, 21, 8], [13, 12, 11, 10, 9]]를 return 합니다.


풀이

-> answer 배열을 n x n 사이즈로 초기화해준다. num 변수를 1로 생성한다. 행과 열의 시작과 끝 변수를 생성해준다. while문을 통해서 num이 n x n과 같아질 때까지 반복한다. "왼쪽에서 오른쪽으로 끝까지 간 후 위에서 아래로 끝까지 채우고, 다시 오른쪽에서 왼쪽으로 끝까지 채우고, 아래에서 위로 끝까지 채운다."를 반복한다. 이 때, for문이 종료될 때 마다, rowStart, rowEnd, colStart, colEnd를 적절하게 변화시켜줘야한다. 예를 들어 처음 오른쪽 끝까지 채운 후 아래로 가야할 때는 rowStart를 증가시켜 아래행부터 시작한다. 이렇게 반복문이 완료된 후 배열 answer를 return하면 결과이다.


코드

class Solution {
    public int[][] solution(int n) {
        int[][] answer = new int[n][n];
        int num = 1; // 배열에 넣을 숫자를 초기화

        int rowStart = 0, rowEnd = n - 1; // 행 시작과 끝 인덱스 초기화
        int colStart = 0, colEnd = n - 1; // 열 시작과 끝 인덱스 초기화

        while (num <= n * n) {
            // 왼쪽에서 오른쪽으로 숫자 채우기
            for (int i = colStart; i <= colEnd; i++) {
                answer[rowStart][i] = num++;
            }
            rowStart++; // 위쪽 행을 다 채웠으므로 행 시작 인덱스 증가

            // 위에서 아래로 숫자 채우기
            for (int i = rowStart; i <= rowEnd; i++) {
                answer[i][colEnd] = num++;
            }
            colEnd--; // 오른쪽 열을 다 채웠으므로 열 끝 인덱스 감소

            // 오른쪽에서 왼쪽으로 숫자 채우기
            for (int i = colEnd; i >= colStart; i--) {
                answer[rowEnd][i] = num++;
            }
            rowEnd--; // 아래쪽 행을 다 채웠으므로 행 끝 인덱스 감소

            // 아래에서 위로 숫자 채우기
            for (int i = rowEnd; i >= rowStart; i--) {
                answer[i][colStart] = num++;
            }
            colStart++; // 왼쪽 열을 다 채웠으므로 열 시작 인덱스 증가
        }

        return answer;
    }
}
반응형
반응형

문제 설명

문자열들이 담긴 리스트가 주어졌을 때, 모든 문자열들을 순서대로 합친 문자열을 꼬리 문자열이라고 합니다. 꼬리 문자열을 만들 때 특정 문자열을 포함한 문자열은 제외시키려고 합니다. 예를 들어 문자열 리스트 ["abc", "def", "ghi"]가 있고 문자열 "ef"를 포함한 문자열은 제외하고 꼬리 문자열을 만들면 "abcghi"가 됩니다.

문자열 리스트 str_list와 제외하려는 문자열 ex가 주어질 때, str_list에서 ex를 포함한 문자열을 제외하고 만든 꼬리 문자열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ str_list의 길이 ≤ 10
  • 1 ≤ str_list의 원소의 길이 ≤ 10
  • 1 ≤ ex의 길이 ≤ 5

str_list ex result
["abc","def","ghi"] "ef" "abcdghi"
["abc","bbc","cbc"] "c" ""

 

입출력 예 설명

 

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 리스트 안의 모든 문자열이 "c"를 포함하므로 빈 문자열을 return합니다.

풀이

 

-> ArrayList를 선언한 후 반복문을 통해서 str_list에 ex값을 포함하고 있는지 contains 함수를 통해 확인한 후 포함하고 있으면 제외하고, 포함하고 있지 않으면 ArrayList에 담는다. 그 후, StringBuilder로 result를 선언하고, 반복문을 통해 ArrayList에 담았던 값들을 result에 append해서 return 해준다.

 


코드

 

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

class Solution {
    public String solution(String[] str_list, String ex) {
        List<String> filteredList = new ArrayList<>();

        for (String str : str_list) {
            if (!str.contains(ex)) {
                filteredList.add(str);
            }
        }

        StringBuilder result = new StringBuilder();
        for (String str : filteredList) {
            result.append(str);
        }

        return result.toString();
    }
}

 

반응형
반응형

문제 설명

0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다.

각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요.

 


제한사항

 

  • 3 ≤ rank의 길이 = attendance의 길이 ≤ 100
  • rank[i]는 i번 학생의 선발 고사 등수를 의미합니다.
  • rank의 원소는 1부터 n까지의 정수로 모두 서로 다릅니다.
  • attendance[i]는 i번 학생의 전국 대회 참석 가능 여부를 나타냅니다.
    • attendance[i]가 true라면 참석 가능, false면 참석 불가능을 의미합니다.
  • attendance의 원소 중 적어도 3개는 true입니다.

입출력 예

 

rank attendance result
[3,7,2,5,4,6,1] [false,true,true,true,true,false,false] 20403
[1,2,3] [true,true,true] 102
[6,1,5,2,3,4] [true,false,true,false,false,true] 50200

입출력 예 설명

 

입출력 예 #1

  • 예제 1번에서 1등은 6번 학생이지만 전국 대회에 참석 불가능하므로 넘어갑니다. 2등은 2번 학생이고 전국 대회에 참석 가능하므로 1순위로 선발됩니다. 3등은 0번 학생이고 전국 대회에 참석 불가능 하므로 넘어갑니다. 4등과 5등은 각각 4번, 3번 학생이고 두 학생 모두 전국 대회에 참석 가능하므로 각각 2순위, 3순위로 선발됩니다. 3명을 선발하였으므로 6등과 7등은 확인하지 않아도 됩니다. 따라서 10000 × 2 + 100 × 4 + 3 = 20403을 return 합니다.

입출력 예 #2

  • 예제 2번에서 1, 2, 3등은 각각 0번, 1번, 2번 학생이고 세 학생 모두 전국 대회에 참석 가능하므로 각각 1순위, 2순위, 3순위로 선발됩니다. 따라서 10000 × 0 + 100 × 1 + 2 = 102를 return 합니다.

입출력 예 #3

  • 예제 3번에서 1, 2, 3등은 각각 1번, 3번, 4번 학생이지만 세 학생 모두 전국 대회에 참석 불가능합니다. 다음으로 4, 5, 6등은 각각 5번, 2번, 0번 학생이고 세 학생 모두 전국 대회에 참석 가능하므로 각각 1순위, 2순위, 3순위로 선발됩니다. 따라서 10000 × 5 + 100 × 2 + 0 = 50200을 return 합니다.

풀이

 

1. ArrayList를 이용해서 temp배열에 true값을 가진 rank값들만 담는다.

2. temp2라는 정수배열을 선언해서 temp배열에 담은 값들을 옮긴 후에 오름차순으로 sort한다.

3. temp2의 index 0,1,2에 해당하는 값과 같은 값을 가지는 rank배열의 값의 index를 미리 선언해둔 a 배열에 담는다.

4. a배열의 3개 값으로 result값을 계산한다.


코드

 

import java.util.*;
class Solution {
    public int solution(int[] rank, boolean[] attendance) {
        int answer = 0;
        int[] a={0,0,0};
        int b=0;
        int c=0;
        ArrayList<Integer> temp = new ArrayList<>();
        for(int i=0;i<rank.length;i++){
            if(attendance[i]==true){
                temp.add(rank[i]);
            }
        }
        int[] temp2 = new int[temp.size()];
        for(int i=0;i<temp.size();i++){
            temp2[i]=temp.get(i);
        }
        Arrays.sort(temp2);
        for(int i=0;i<rank.length;i++){
            for(int j=0;j<3;j++){
                if(temp2[j]==rank[i]){
                    a[j]=i;
                }
            }
        }
        answer = a[0]*10000+a[1]*100+a[2];
        return answer;
    }
}
반응형
반응형

문제 설명

 

문자열 배열 strArr이 주어집니다. strArr의 원소들을 길이가 같은 문자열들끼리 그룹으로 묶었을 때 가장 개수가 많은 그룹의 크기를 return 하는 solution 함수를 완성해 주세요.


제한사항

 

1 ≤ strArr의 길이 ≤ 100,000

  • 1 ≤ strArr의 원소의 길이 ≤ 30
  • strArr의 원소들은 알파벳 소문자로 이루어진 문자열입니다.

입출력 예

 

strArr result
["a","bc","d","efg","hi"] 2

 


입출력 예 설명

 

입출력 예 #1

각 문자열들을 길이에 맞게 그룹으로 묶으면 다음과 같습니다.

 

문자열 길이 문자열 목록 개수
1 ["a","d"] 2
2 ["bc","hi"] 2
3 ["efg"] 1

풀이

 

1. 배열을 동적으로 담기 위해 temp라는 배열을 ArrayList로 선언한다. temp 배열에 strArr의 각 원소들의 길이값을 중복없이 담는다.

2. int[] 구조로 temp2 배열을 temp.size()크기로 선언해준다. 이는 strArr의 각 원소들의 길이 값을 가지는 원소가 몇개 있는지 담기 위함이다. 그리고 반복문을 통해서 길이값-1에 해당하는 인덱스의 temp2값을 +1 해준다.

3. temp2의 개수만큼 반복문을 돌리면서 가장 큰값을 answer값에 담는다.


코드

 

import java.util.*;
class Solution {
    public int solution(String[] strArr) {
        int answer = 0;
        ArrayList<Integer> temp = new ArrayList<>();
        for(int i=0;i<strArr.length;i++){
            if(!temp.contains(strArr[i].length())){
                temp.add(strArr[i].length());
            }
        }
        
        int[] temp2 = new int[temp.size()];
        for(int i=0;i<strArr.length;i++){
            temp2[strArr[i].length()-1]++;
        }
        
        for(int i=0;i<temp2.length;i++){
            if(answer<temp2[i]){
                answer = temp2[i];
            }
        }
        return answer;
    }
}
반응형
반응형

문제 설명

 

랜덤으로 서로 다른 k개의 수를 저장한 배열을 만드려고 합니다. 적절한 방법이 떠오르지 않기 때문에 일정한 범위 내에서 무작위로 수를 뽑은 후, 지금까지 나온적이 없는 수이면 배열 맨 뒤에 추가하는 방식으로 만들기로 합니다.

이미 어떤 수가 무작위로 주어질지 알고 있다고 가정하고, 실제 만들어질 길이 k의 배열을 예상해봅시다.

정수 배열 arr가 주어집니다. 문제에서의 무작위의 수는 arr에 저장된 순서대로 주어질 예정이라고 했을 때, 완성될 배열을 return 하는 solution 함수를 완성해 주세요.

단, 완성될 배열의 길이가 k보다 작으면 나머지 값을 전부 -1로 채워서 return 합니다.


제한사항

 

1 ≤ arr의 길이 ≤ 100,000

  • 0 ≤ arr의 원소 ≤ 100,000

1 ≤ k ≤ 1,000


입출력 예

 

arr k result
[0,1,1,2,2,3] 3 [0,1,2]
[0,1,1,1,1] 4 [0,1,-1,-1]

입출력 예 설명

 

입출력 예 #1

앞에서부터 서로 다른 k개의 수를 골라내면 [0, 1, 2]가 됩니다. 따라서 [0, 1, 2]를 return 합니다.

 

입출력 예 #2

서로 다른 수의 개수가 2개 뿐이므로 서로 다른 수들을 앞에서부터 차례대로 저장한 [0, 1]에서 이후 2개의 인덱스를 -1로 채워넣은 [0, 1, -1, -1]을 return 합니다.


풀이

 

-> 동적으로 배열을 담기 위해 우선 ArrayList를 사용하였다. answer의 크기는 k로 초기화하였고, -1값을 기본적으로 담아두었다. 그 다음 ArrayList인 temp를 선언하여 temp에 arr[i] 값이 없으면 추가하였다. temp에 값을 다 추가한 후에 temp의 size가 큰지, k 값이 큰지 삼항연산자를 통해 비교하여 answer에 temp값을 담는 for문에 사용하였다. 그런 후에 return~


코드

 

import java.util.*;
class Solution {
    public int[] solution(int[] arr, int k) {
        int[] answer = {};
        answer = new int[k];
        for(int i=0;i<k;i++){
            answer[i]=-1;
        }
        
        ArrayList<Integer> temp = new ArrayList<>();
        for(int i=0;i<arr.length;i++){
            if(!temp.contains(arr[i])){
                temp.add(arr[i]);
            }
        }
        
        int n = temp.size()>k?k:temp.size();
        
        for(int i=0;i<n;i++){
           answer[i]=temp.get(i);
        }
        return answer;
    }
}
반응형
반응형

문제 설명

 

문자 "A"와 "B"로 이루어진 문자열 myString과 pat가 주어집니다. myString의 "A"를 "B"로, "B"를 "A"로 바꾼 문자열의 연속하는 부분 문자열 중 pat이 있으면 1을 아니면 0을 return 하는 solution 함수를 완성하세요.

 


제한사항

 

1 ≤ myString의 길이 ≤ 100

1 ≤ pat의 길이 ≤ 10

myString과 pat는 문자 "A"와 "B"로만 이루어진 문자열입니다.


입출력 예

 

myString pat result
"ABBAA" "AABB" 1
"ABAB" "ABAB" 0

입출력 예 설명

 

입출력 예 #1

"ABBAA"에서 "A"와 "B"를 서로 바꾸면 "BAABB"입니다. 여기에는 부분문자열 "AABB"가 있기 때문에 1을 return 합니다.

 

입출력 예 #2

"ABAB"에서 "A"와 "B"를 서로 바꾸면 "BABA"입니다. 여기에는 부분문자열 "BABA"가 없기 때문에 0을 return 합니다.

※ 2023년 05월 15일 제한사항 및 테스트 케이스가 수정되었습니다. 기존에 제출한 코드가 통과하지 못할 수 있습니다.


풀이

 

-> 먼저 반복문을 통해서 myString을 변환한다. temp라는 변수를 만들어 변환한 문자열을 담아준다. 그리고 java.util.*을 import해준 후에 contains 함수를 통해서 pat에 해당하는 문자열이 temp에 포함되고 있는지를 확인한다.


코드

 

import java.util.*;
class Solution {
    public int solution(String myString, String pat) {
        int answer = 0;
        String temp = "";
        for(int i=0; i<myString.length();i++){
            temp+=myString.charAt(i)=='A'?"B":"A";
        }
        
        if(temp.contains(pat)){
            answer = 1;
        }
        
        return answer;
    }
}
반응형
반응형

문제 설명

 

문자열 myString이 주어집니다. myString에서 알파벳 "a"가 등장하면 전부 "A"로 변환하고, "A"가 아닌 모든 대문자 알파벳은 소문자 알파벳으로 변환하여 return 하는 solution 함수를 완성하세요.


제한사항

 

1 ≤ myString의 길이 ≤ 20

  • myString은 알파벳으로 이루어진 문자열입니다.

입출력 예

 

myString result
"abstract algebra" "AbstrAct AlgebrA"
"PrOgRaMmErS" "progrAmmers"

입출력 예 설명

 

입출력 예 #1

0번, 5번, 9번, 15번 인덱스의 "a"는 소문자이므로 전부 대문자로 고쳐줍니다.

다른 문자들은 전부 "a"가 아닌 소문자이므로 바꾸지 않습니다.

따라서 "AbstrAct AlgebrA"를 return 합니다.

 

입출력 예 #2

0번, 2번, 4번, 6번, 8번, 10번 인덱스의 문자들은 "A"가 아닌 대문자이므로 전부 소문자로 고쳐줍니다.

5번 인덱스의 "a"는 소문자이므로 대문자로 고쳐줍니다.

다른 문자들은 전부 "a"가 아닌 소문자이므로 바꾸지 않습니다.

따라서 "progrAmmers"를 return 합니다.


풀이

 

-> 문자열을 array로 변환했다가 다시 문자열로 합치는 부분을 한번 정리하고 싶어서 작성했다.


코드

 

class Solution {
    public String solution(String myString) {
        String answer = "";
        char[] charArray = myString.toCharArray();
        
        for(int i=0;i<charArray.length;i++){
            if(charArray[i]=='a'||charArray[i]=='A'){
                charArray[i]=Character.toUpperCase(charArray[i]);
            } else {
                charArray[i]=Character.toLowerCase(charArray[i]);
            }
        }
        
        answer = new String(charArray);
        return answer;
    }
}
반응형
반응형

문제 설명

 

정수 배열 arr가 주어집니다. arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다. 이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다


제한사항

 

1 ≤ arr의 길이 ≤ 1,000,000

  • 1 ≤ arr의 원소의 값 ≤ 100

입출력 예

 

arr result
[1,2,3,100,99,98] 5

입출력 예 설명

 

입출력 예 #1

위 작업을 반복하면 다음과 같이 arr가 변합니다.

반복 횟수 arr
0 [1,2,3,100,99,98]
1 [3,2,7,50,99,49]
2 [7,2,15,25,99,99]
3 [15,2,31,51,99,99]
4 [31,2,63,51,99,99]
5 [63,2,63,51,99,99]
6 [63,2,63,51,99,99]

 

이후로 arr가 변하지 않으며, arr(5) = arr(6)이므로 5를 return 합니다.


풀이 

 

-> 먼저 배열의 이전 기록을 담을 temp 배열을 만들어준다. temp에 arr를 넣어주고 arr는 위의 규칙에 맞게 작업해준다. 작업이 완료된 후 temp의 각 요소와 arr의 각 요소가 모두 같은지 비교한다. 이 때, count라는 변수를 0으로 초기화해두고 하나라도 다르면 count++을 해준다. count가 0이 아니면 answer도 증가시킨다. count가 0일 때의 answer값은 마지막 작업이 완료된 후이므로 해당 answer보다 1단계 전단계인 값이 답이 된다. 따라서 answer-1을 return한다.


코드

 

import java.util.*;
class Solution {
    public int solution(int[] arr) {
        int answer = 0;
        boolean ending = false;
       while(!ending){
           int count = 0;
           
            int[] temp = new int[arr.length];
            for(int i=0;i<arr.length;i++){
                temp[i]=arr[i];
            }
            for(int i=0;i<arr.length;i++){
                if(arr[i]>=50&&arr[i]%2==0){
                    arr[i]=arr[i]/2;
                } else if(arr[i]<50&&arr[i]%2==1) {
                    arr[i]=arr[i]*2+1;
                }
            }
            for(int i=0;i<arr.length;i++){
                if(temp[i]!=arr[i]){
                    count++;
                }
            }
            if(count==0){
                ending = true;
            }
            answer++;
        }
        return answer-1;
    }
}
반응형

+ Recent posts