Day 17 문자열, 수학, 조건문, 배열, 사칙연산
Day17 17단계 20231106
1. 숫자 찾기
- 내 풀이 : num을 String화 시킨 다음, String.charAt(i)을 사용해서 k와 같은 값의 위치를 반환
class Solution {
public int solution(int num, int k) {
int answer = -1;
String strNum = String.valueOf(num);
for(int i = 0; i < strNum.length(); i++) {
if (strNum.charAt(i) -'0' == k) {
answer = i+1;
return answer;
}
}
return answer;
}
}
- 다른 사람 풀이 1 : String.indexOf(k)를 사용해서 처음 k가 등장하는 위치 반환
String strNum = String.valueOf(num);
String strK = String.valueOf(k);
int answer = strNum.indexOf(strK);
return (answer < 0) ? -1 : answer + 1;
- 다른 사람 풀이 2 : num을 String.valueOf로 변환하지 않고 ""을 추가하여 변환
- 여기서 "-"를 추가한 이유는 index를 0이 아닌 1부터 세기 위해 임의의 문자를 추가
return ("-" + num).indexOf(String.valueOF(k));
2. n의 배수 고르기
import java.util.*;
class Solution {
public int[] solution(int n, int[] numlist) {
List<Integer> list = new ArrayList<>();
for (int i : numlist) {
if (i % n == 0) {
list.add(i);
}
}
return list.streamintValue).toArray(;
}
}
- 다른 사람 풀이 : Stream에서 filter()를 사용하여 배수만 저장
return Array.stream(numlist).filter(i -> i % n ==0).toArray();
3. 자릿수 더하기
- 내 풀이 : Math.log10()을 사용하여 n의 자릿수를 구하고, 10^(n의 자릿수)인 div라는 변수로 n를 나눈 몫을 반환.
- Math 클래스의 Math.log10 메소드 사용
- n의 일의 자리 숫자까지 반환하도록 n과 div를 계속해서 10으로 나누었다.
- 이 풀이에서는 n의 자릿수에 해당하는 10^x 제곱으로 먼저 나누어 몫을 더하기에 가장 큰 자릿수부터 먼저 더한다.
class Solution {
public int solution(int n) {
int answer = 0;
int div = (int)Math.pow(10, (int)(Math.log10(n)));
while (div > 0) {
answer += n / div;
n %= div;
div /= 10;
}
return answer;
}
}
- 다른 사람 풀이 : 위 과정을 훨씬 간단하게 쓸 수 있었다.
- 이 풀이에서는 10으로 먼저 나누어 나머지가 되는 일의 자리 숫자부터 먼저 더한다.
answer = 0;
while (n > 0) {
answer += n % 10; // 일의 자리 숫자를 더함
n /= 10;
}
return answer;
4. OX퀴즈
- 내 풀이 : 연산자들을 먼저 제거하고, "- "의 경우엔 Day 16 문자열, 수학, 배열, 조건문#3. 문자열 계산하기의 다른 사람 풀이를 참고하여 "-"로 변환했다. 그 다음 StringTokenizer를 사용하여 공백을 기준으로 나뉜 숫자들을 저장하고 연산을 진행하여 결과를 비교하여 answer에 O, X를 저장했다.
import java.util.*;
class Solution {
public String[] solution(String[] quiz) {
String[] answer = new String[quiz.length];
StringTokenizer st;
for(int i = 0; i < quiz.length; i++) {
quiz[i] = quiz[i].replace("+ ", "");
quiz[i] = quiz[i].replace("- ", "-");
quiz[i] = quiz[i].replace("= ", "");
st = new StringTokenizer(quiz[i], " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken().replace("--", ""));
int c = Integer.parseInt(st.nextToken());
if(a+b == c) {
answer[i] = "O";
} else {
answer[i] = "X";
}
}
return answer;
}
}
- 다른 사람 풀이 : quiz의 요소인 String을 split(" ")해준 다음, 그 결과 배열의 요소를 더해주었다. 특히 배열의 요소들에는 항상 고정된 위치에 예상 가능한 값이 들어오므로(0번에 첫 번째 숫자, 1번에 연산자, 2번에 두 번째 숫자, 3번에 "=", 4번에 세 번째 숫자) 두 번째 숫자만 연산자 상태에 대해 변환해주면 된다.
String[] answer = new String[quiz.length];
for(int i = 0; i < quiz.length; i++) {
String[] str = quiz[i].split(" ");
int conv = Integer.parseInt(str[2]) * ((str[1].equals("+")) ? 1 : -1);
answer[i] = (Integer.parseInt(str[0])+conv == Integer.parseInt(str[4])) ? "O" : "X";
}
return answer;