배열
- 6. [Java] 약수구하기 - list.toArray(new String[0]);
- 7. [Java] 가장 큰 수 찾기- return new int[]{max, idx};
- 8. [Java] 문자열 계산하기 - Character.isDigit(c)
- 9. [Java] 배열의 유사도(배열, Set) - set.contains(str)
- 11. [Java] 삼각형의 완성조건(2): case2는 왜 longer - shorter인가?
6. [Java] 약수구하기 - list.toArray(new String[0]);
https://school.programmers.co.kr/learn/courses/30/lessons/120897
틀린 코드
import java.util.*;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i <= n; i++) {
if(n%i==0) list.append(i);
}
int[] answer = list.toArray(new String[0]);
return answer;
}
}
✅ for (int i = 0; i <= n; i++)
- ❗ i = 0일 때 n % 0은 ArithmeticException (0으로 나눌 수 없음!)
- ✅ 따라서 i = 1부터 시작해야 한다.
✅ list.add(i)
- ArrayList에서 값을 추가할 때는 append()가 아니라 add()를 사용해야 한다.
- list.append(i) → list.add(i)
✅ int[] answer = list.toArray(new String[0]);
- List → Array 로 변환할때 참조형은 toArray() 메서드로 가능하지만 int 같은 기본형은 직접 변환할 수 없다.
- 직접 반복문을 돌려서 변환해야 한다.
개선한 코드
import java.util.*;
class Solution {
public int[] solution(int n) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if(n%i==0) list.add(i);
}
int[] answer = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
answer[i] = list.get(i);
}
return answer;
}
}
Stream 사용 버전
import java.util.*;
import java.util.stream.*;
class Solution {
public int[] solution(int n) {
return IntStream.rangeClosed(1, n) // 1부터 n까지 숫자 생성
.filter(i -> n % i == 0) // 약수만 필터링
.toArray(); // int[]로 반환
}
}
List → Array 형변환
List 타입 | 변환 방법 |
---|---|
|
|
|
|
| 반복문으로 수동 변환 필요 |
✅ 1. List → Array (참조형, 예: Integer, String 등)
- toArray() 메서드로 변환이 가능하다.
List<String> list = Arrays.asList("a", "b", "c");
String[] arr = list.toArray(new String[0]);
- list.toArray(new String[0]): 타입을 명시한 배열로 변환
- new String[0]은 사이즈가 0이어도 자동으로 맞춰준다.
List<Integer> list = Arrays.asList(1, 2, 3);
Integer[] arr = list.toArray(new Integer[0]);
✅ 2. List → Array (기본형, 예: int)
- Java의 List<Integer>는 int[]로 직접 변환 불가능
- 직접 반복문으로 넣어줘야 한다.
List<Integer> list = Arrays.asList(1, 2, 3);
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
arr[i] = list.get(i); // 언박싱 자동 수행
}
Array → List 형변환
변환 방법 | |
---|---|
|
|
|
|
| Arrays.stream(arr).boxed().collect(Collectors.toList()) |
✅ 1. 참조형 배열 → List (예: String[], Integer[] 등)
String[] arr = {"a", "b", "c"};
List<String> list = Arrays.asList(arr);
- Arrays.asList()는 배열을 고정 크기 리스트로 바꿔준다.
- 추가/삭제는 불가능 → 변경 가능한 리스트로 바꾸려면
List<String> modifiableList = new ArrayList<>(Arrays.asList(arr));
✅ 2. 기본형 배열 → List (예: int[], double[] 등)
- 자바의 int[]는 바로 List<Integer>로 바꿀 수 없다.
- Stream + boxed()를 활용한다.
int[] arr = {1, 2, 3, 4};
List<Integer> list = Arrays.stream(arr) // IntStream 생성
.boxed() // int → Integer (박싱)
.collect(Collectors.toList());
7. [Java] 가장 큰 수 찾기- return new int[]{max, idx};
https://school.programmers.co.kr/learn/courses/30/lessons/120899
틀린 코드
import java.util.*;
class Solution {
public int[] solution(int[] array) {
Arrays.sort(array);
int[] answer = new int[2];
answer[0] = array[array.length-1];
answer[1] = array.length-1;
return answer;
}
}
✅ index 계산 잘못됨
- array[array.length-1]는 정렬된 배열에서 최댓값이 맞지만, array.length-1은 최댓값의 원래 인덱스가 아님.
- 배열을 오름차순 정렬해버리면, 원래 배열에서 최댓값의 인덱스는 사라진다.
- 따라서 최댓값을 담을 변수 max, 인덱스를 담을 변수 idx를 선언하고 반복문을 돌려 최댓값과 인덱스를 갱신한 후, 두 변수를 배열로 변환해서 반환한다.
개선한 코드
import java.util.*;
class Solution {
public int[] solution(int[] array) {
int max = array[0];
int idx = 0;
for(int i = 1; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
idx = i;
}
}
return new int[]{max, idx};
}
}
배열 리터럴을 반환할 때 쓰는 코드
int형 두 개짜리 배열을 직접 생성하고, 그 배열을 메서드의 반환값으로 사용하는 코드이다.
return new int[]{max, idx};
아래와 같이 배열을 만들고 반환하는 코드인데 한 줄로 줄인 것이다.
int[] result = new int[]{max, idx};
return result;
Java에서 return은 값을 반환하기만 하면 되기 때문에, 굳이 int[] result = ...처럼 중간에 변수에 담을 필요가 없다.
배열 리터럴은 선언 없이 쓰면 컴파일 오류가 난다.
int[] a;
a = {1, 2}; // ❌ 컴파일 오류
→ 대신 이렇게 써야 한다.
int[] a = new int[]{1, 2};
8. [Java] 문자열 계산하기 - Character.isDigit(c)
https://school.programmers.co.kr/learn/courses/30/lessons/120902
틀린 코드 (1차 시도)
class Solution {
public int solution(String my_string) {
char[] arr = my_string.toCharArray();
int sum = 0;
for (char c : arr ) {
if (c != '+' && c != '-' && c !=' ') {
sum+= Integer.parseInt(c);
}
}
return sum;
}
}
✅ Integer.parseInt()
- String을 int형으로 변환하는 코드를 써서 에러가 났다.
- char타입을 정수로 변환할 때는 Integer.parseInt() 대신 char 타입 변수에 - '0'을 한다. (ASCII 코드)
String → int VS char → int
1. String을 int로 변환할 때는 Integer.parseInt()
String str = "123";
// 문자열 → int
int num = Integer.parseInt(str); // 123
2. char을 숫자로 변환할 때는 char 타입 변수 - '0'
char c = '7';
// 문자 → 숫자 (정수값)
int digit = c - '0'; // '7' - '0' = 7
틀린 코드 (2차 시도)
class Solution {
public int solution(String my_string) {
char[] arr = my_string.toCharArray();
int sum = 0;
for (char c : arr ) {
if (c != '+' && c != '-' && c !=' ') {
sum+= c - '0';
}
}
return sum;
}
}
내가 쓴 코드는 모든 숫자를 "한 자리 숫자"로 처리한다. 즉, "12"가 있으면 1 + 2 = 3으로 계산한다.
String my_string = "a12b3";
→ arr = ['a', '1', '2', 'b', '3']
→ 결과: 1 + 2 + 3 = 6 (❗ 실제 12 + 3이 아님)
문제에서 원하는 것은 만약 "12 + 3" → 15로 계산하는 것이다.
String num 변수를 밖으로 빼고, Character.isDigit() 으로 c가 0~9사이 숫자형 문자열이면 num에 저장하는 형식으로 코드를 짜 주었다.
틀린 코드 (3차 시도)
class Solution {
public int solution(String my_string) {
char[] arr = my_string.toCharArray();
int sum = 0;
String num = "";
for (char c : arr ) {
if (Character.isDigit(c)) {
num += c;
} else {
if (!num.isEmpty()) {
sum += Integer.parseInt(num);
num = "";
}
}
}
if (!num.isEmpty()) {
sum += Integer.parseInt(num);
}
return sum;
}
}
덧셈만 하는게 아니라 뺄셈도 있었다. 연산자(+, -)에 따라 연산을 모두 처리하는 코드를 짜야 한다.
- 문자열을 " "(공백) 기준으로 나눠서
- 처음 값은 result에 저장
- 이후에는 연산자(+ 또는 -)와 숫자가 번갈아 등장
- 연산자에 따라 +면 더하고, -면 빼야 함
틀린 코드 (4차 시도)
class Solution {
public int solution(String my_string) {
String[] splited = my_string.split(" ");
int answer = Integer.parseInt(splited[0]);
for(int i = 1; i < splited.length; i += 2) {
String op = splited[i];
int num = Integer.parseInt(splited[i + 1]);
if (op == '+')) {
answer += num;
} else if (op == '-') {
answer -= num;
}
}
return answer;
}
}
✅ if(op == '+')
- 이 코드는 컴파일 에러가 난다.
- op는 String 타입으로 선언되었는데 '+'는 char로 타입이 달라서 비교 불가능하기 때문이다.
- Java에서는 문자열 내용을 비교할 때 ==를 쓰지 않는다. ==는 두 객체가 같은 주소(참조)를 가리킬 때만 true이다.
- 내용 비교는 반드시 .equals()를 써야 한다.
개선한 코드
class Solution {
public int solution(String my_string) {
String[] splited = my_string.split(" ");
int answer = Integer.parseInt(splited[0]);
for(int i = 1; i < splited.length; i += 2) {
String op = splited[i];
int num = Integer.parseInt(splited[i + 1]);
if (op.equals("+")) {
answer += num;
} else if (op.equals("-")) {
answer -= num;
}
}
return answer;
}
}
9. [Java] 배열의 유사도(배열, Set) - set.contains(str)
https://school.programmers.co.kr/learn/courses/30/lessons/120903
Set 을 활용한 코드
import java.util.*;
class Solution {
public int solution(String[] s1, String[] s2) {
Set<String> set = new HashSet<>(Arrays.asList(s1));
int cnt = 0;
for (String str : s2) {
if (set.contains(str)) cnt++;
}
return cnt;
}
}
✅ Set<String> set = new HashSet<>(Arrays.asList(s1));
- Set은 중복을 허용하지 않고, 검색 속도가 빠르기 때문에 비교 대상인 s1을 Set으로 변환하면 s2의 각 원소가 포함되어 있는지 빠르게 확인할 수 있다.
이중 for문(반복문)을 사용한 코드
class Solution {
public int solution(String[] s1, String[] s2) {
int cnt = 0;
for (int i = 0; i < s1.length; i++) {
for (int j = 0; j < s2.length; j++) {
if (s1[i].equals(s2[j])) {
cnt++;
break;
}
}
}
return cnt;
}
}
- 중복 카운팅을 피하려면 break;를 해야 한다.
- 문자열끼리 내용 비교는 .equals() 메서드를 사용해야 한다 ( == 은 주소값 비교)
11. [Java] 삼각형의 완성조건(2): case2는 왜 longer - shorter인가?
1. 문제 요약
- https://school.programmers.co.kr/learn/courses/30/lessons/120868
- 프로그래머스 삼각형의 완성조건(2)
- 두 변이 주어졌을 때, 나머지 한 변
x
가 삼각형이 될 수 있는 정수 개수를 구하는 문제 - 삼각형이 되기 위한 조건: 가장 긴 변 < 나머지 두 변의 합
2. 정수 범위 공식
- x ∈ (longer - shorter, longer + shorter)
- 즉, 가능한 정수 x의 범위는
- longer - shorter + 1 ≤ x ≤ longer + shorter - 1
코드
import java.util.*;
class Solution {
public int solution(int[] sides) {
Arrays.sort(sides); // 배열 오름차순 정렬
int shorter = sides[0];
int longer = sides[1];
// case1: x가 가장 긴 변일 때 -> x < a + b
int case1 = longer + shorter - 1;
// case2: x가 짧거나 중간인 경우 -> x > max - min
int case2 = longer - shorter;
return case1 - case2;
}
}
3. 왜 case2 = longer - shorter
인가?
case2
는 가능한 x의 시작값이 아님- 실제 시작값은
longer - shorter + 1
- 하지만 정수 개수를 계산할 때는 시작값 - 1을 기준으로 계산해야 하므로
case2 = longer - shorter
로 설정하는 것이 정확함
4. 예시
- 입력: sides = [3, 6]
- 가능한 x: 4, 5, 6, 7, 8 → 총 5개
- 계산:
case1 = 3 + 6 - 1 = 8
case2 = 6 - 3 = 3
answer = 8 - 3 = 5 ✅
요약
case2
는 정수 개수 계산용 보조값- 실제 시작값보다 1 작게 설정되어야 하므로
+1
이나-1
필요 없음 - 수식 하나로 정확히 계산 가능
- (shorter + longer - 1) - (longer - shorter)