Open jaeyyyyy opened 11 months ago
문자 개수 세기 (https://school.programmers.co.kr/learn/courses/30/lessons/181902)
my_string
이 주어질 때, my_string
에서 'A'의 개수, my_string
에서 'B'의 개수,..., my_string
에서 'Z'의 개수, my_string
에서 'a'의 개수, my_string
에서 'b'의 개수,..., my_string
에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.my_string
의 길이 ≤ 1,000my_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번의 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개라 이 방법은 효율적이지 않다고 판단
my_string
을 charAt(i)로 잘라냄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;
}
}
배열 만들기(https://school.programmers.co.kr/learn/courses/30/lessons/181901)
n
과 k
가 주어졌을 때, 1 이상 n
이하의 정수 중에서 k
의 배수를 오름차순으로 저장한 배열을 return 하는 solution 함수를 완성해 주세요.n
≤ 1,000,000k
≤ min(1,000, n
)n | k | result |
---|---|---|
10 | 3 | [3, 6, 9] |
15 | 5 | [5, 10, 15] |
1 이상 10 이하의 3의 배수는 3, 6, 9 이므로 [3, 6, 9]를 return 합니다.
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;
}
}
객체와 객체지향에 대해 정리했습니다 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
아직 개념 이해가 부족한 관계로 더 찾아보면서 내용이 추가될 수도 있습니다. ^^;;>
문제 1
문제
qr code(https://school.programmers.co.kr/learn/courses/30/lessons/181903)
q
,r
과 문자열code
가 주어질 때,code
의 각 인덱스를q
로 나누었을 때 나머지가r
인 위치의 문자를 앞에서부터 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.입출력 예
입출력 예 1
q
와r
은 각각 3, 1이고 인덱스와 그 값을q
로 나눈 나머지가 잘 보이도록 표로 만들면 다음과 같습니다.q
로 나눈 나머지가 1인 인덱스의 문자들을 앞에서부터 순서대로 이어 붙이면 "jerry"가 되므로 이를 return 합니다.입출력 예 2
q
로 나눈 나머지가 잘 보이도록 표로 만들면 다음과 같습니다.q
로 나눈 나머지가 1인 인덱스의 문자들을 앞에서부터 순서대로 이어 붙이면 "programmers"가 되므로 이를 return 합니다.문제 풀이
ArrayList를 사용해서 문자열을 배열로 나누려고 했는데 다시 생각해보니까 굳이 그렇게 할 필요는 없겠다.. 싶었고
code
의 각 인덱스를q
로 나누었을 때 나머지가r
인 위치의 문자 -> i % q == r 라는 조건을 만족하도록 작성회고