enoch012 / JavaBasicStudy

Java 기초 스터디 (2023.09 ~ 10)
0 stars 1 forks source link

10월 15일 / 코딩테스트 연습 (jaeyeon) #18

Open jaeyyyyy opened 11 months ago

jaeyyyyy commented 11 months ago

문제 1

문제

qr code(https://school.programmers.co.kr/learn/courses/30/lessons/181903)

입출력 예

q r code result
3 1 "qjnwezgrpirldywt" "jerry"
1 0 "programmers" "programmers"

입출력 예 1

code q j n w e z g r p i r l d y w t
index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
q로 나눈 나머지 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0

q로 나눈 나머지가 1인 인덱스의 문자들을 앞에서부터 순서대로 이어 붙이면 "jerry"가 되므로 이를 return 합니다.

입출력 예 2

q로 나눈 나머지가 잘 보이도록 표로 만들면 다음과 같습니다.

code p r o g r a m m e r s
index 0 1 2 3 4 5 6 7 8 9 10
q로 나눈 나머지 0 0 0 0 0 0 0 0 0 0 0

q로 나눈 나머지가 1인 인덱스의 문자들을 앞에서부터 순서대로 이어 붙이면 "programmers"가 되므로 이를 return 합니다.

문제 풀이

ArrayList를 사용해서 문자열을 배열로 나누려고 했는데 다시 생각해보니까 굳이 그렇게 할 필요는 없겠다.. 싶었고

class Solution {
    public String solution(int q, int r, String code) {
        StringBuilder answer = new StringBuilder();

        for (int i = 0; i < code.length(); i++) {
            if (i % q == r) {
                answer.append(code.charAt(i));
            }
        }

        return answer.toString();
    }
}

회고

class Solution {
    public String solution(int q, int r, String code) {

        StringBuilder sb = new StringBuilder();

        for (int i = r; i < code.length(); i += q)
            sb.append(code.charAt(i));

        return sb.toString();
    }
}
jaeyyyyy commented 11 months ago

문제2

문제

문자 개수 세기 (https://school.programmers.co.kr/learn/courses/30/lessons/181902)

입출력 예

my_string result
"Programmers" [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]

입출력 예 1

예제 1번의 my_string에서 'P'가 1개, 'a'가 1개, 'e'가 1개, 'g'가 1개, 'm'이 2개, 'o'가 1개, 'r'가 3개, 's'가 1개 있으므로 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0]를 return 합니다.

문제 풀이

알파벳 하나당 조건을 걸어야하나 생각했는데, 알파벳이 26개, 대소문자까지 하면 52개라 이 방법은 효율적이지 않다고 판단

class Solution {
    public int[] solution(String my_string) {

        int[] answer = new int[52]; // 알파벳 정수 배열

        for (int i = 0 ; i < my_string.length(); i++) {
            char alpha = my_string.charAt(i);
            if (alpha >= 'A' && alpha <= 'Z') { // 대문자
                answer[alpha - 'A']++;
            } else if (alpha >= 'a' && alpha <= 'z') { // 소문자
                answer[alpha - 'a' + 26]++;
            }
        }

        return answer;
    }
}

char 형은 특이한 연산을 할 수 있다. 'A' - 'A' 을 하면 값이 0 이 된다. 'A' 은 아스키 코드로 65인데 65 - 65가 되어서 0이 나오는 것이다. 형변환을 하지 않아도 char 형끼리 계산하면 int 값을 준다.

다시 말하자면, 나는 alpha >= 'A' && alpha <= 'Z 라고 작성했지만 my_string.charAt(i) >= 65 && my_string.charAt(i) <= 90 이것과도 같다.

이 점을 사용하면 간단하게 문제를 풀 수 있다.

※주의 : 배열에 대문자(A ~ Z), 소문자(a ~ z)순으로 저장되어야하므로 소문자일 경우엔 위치에 26을 더해줘야만 한다.

회고

다른 사람의 코드를 참고하다보니

if(c >= 'a') // 소문자 조건 
else // 대문자

라고 작성한 사람을 봤다. my_string이 알파벳 대소문자로만 이루어진 문자열이기 때문에 이렇게 작성해도 문제는 없겠지만.. 확실하게 알아볼 수 있는 코드가 더 좋지않을까..? 하는 생각..

당연히 아래처럼 isUpperCase , isLowerCase를 사용해도 됨

class Solution {
    public int[] solution(String my_string) {

        int[] answer = new int[52]; // 알파벳 정수 배열

        for (int i = 0 ; i < my_string.length(); i++) {
            char alpha = my_string.charAt(i);
            if (Character.isUpperCase(alpha)) { // 대문자
                answer[alpha - 'A']++;
            } else if (Character.isLowerCase(alpha)) { // 소문자
                answer[alpha - 'a' + 26]++;
            }
        }

        return answer;
    }
}
jaeyyyyy commented 11 months ago

문제 3

문제

배열 만들기(https://school.programmers.co.kr/learn/courses/30/lessons/181901)

입출력 예

n k result
10 3 [3, 6, 9]
15 5 [5, 10, 15]

입출력 예 1

1 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.

입출력 예 2

1 이상 15 이하의 5의 배수는 5, 10, 15 이므로 [5, 10, 15]를 return 합니다.

문제 풀이

import java.util.ArrayList;

class Solution {
    public int[] solution(int n, int k) {
        ArrayList<Integer> answer = new ArrayList<>();
        for (int i = 1; i<=n; i++) { // 1 이상 n이하의 정수 중
            if (i % k == 0) { // k의 배수 
                answer.add(i);
            }
        }

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

    }
}

회고

class Solution {
    public int[] solution(int n, int k) {
        int count = n / k; // count 로 배열의 길이 구하기
        int[] answer = new int[count];

        for (int i = 1; i <= count; i++) { // 조건문 없이도 가능
            answer[i - 1] = k * i;
        }

        return answer;
    }
}
jaeyyyyy commented 11 months ago

객체와 객체지향에 대해 정리했습니다 https://velog.io/@peace_e/Java-%EA%B0%9D%EC%B2%B4%EC%99%80-%EA%B0%9D%EC%B2%B4%EC%A7%80%ED%96%A5

아직 개념 이해가 부족한 관계로 더 찾아보면서 내용이 추가될 수도 있습니다. ^^;;>