Skip to main content

9. [Java] 배열의 유사도(배열, Set)

https://school.programmers.co.kr/learn/courses/30/lessons/120902120903

틀린Set 을 활용한 코드 (1차 시도)

import java.util.*;

class Solution {
    public int solution(StringString[] my_string)s1, String[] s2) {
        char[]Set<String> arrset = my_string.toCharArray(new HashSet<>(Arrays.asList(s1));
        int sumcnt = 0;
        for (charString cstr : arr )s2) {
            if (c != '+' && c != '-' && c !=' 'set.contains(str)) {
                sum+= Integer.parseInt(c)cnt++;
            }
        }
        return sum;cnt; 
    }
}

image.png

Integer.parseInt(Set<String> set = new HashSet<>(Arrays.asList(s1));
  • String을Set은 int형으중복을 허용하지 않고, 검색 속도가 빠르기 때문에 비교 대상인 s1을 Set으로 변환하 코드를s2의 써서 에러원소났다.
  • 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;
    }
}

image.png

내가 쓴 코드는 모든 숫자를 "한 자리 숫자"로 처리한다. 즉, "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;
    }
}

image.png

덧셈만 하는게 아니라 뺄셈도 있었다. 연산자(+, -)에 따라 연산을 모두 처리하는 코드를 짜야 한다.

  1. 문자열을 " "(공백) 기준으로 나눠서
  2. 처음 값은 result에 저장
  3. 이후에는 연산자(+ 또는 -)와 숫자가 번갈아 등장
  4. 연산자에 따라 +면 더하고, -면 빼야 함


틀린 코드 (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()를 써야 한다.


개선이중 for문(반복문)을 사용한 코드

class Solution {
    public int solution(StringString[] my_string) {s1, String[] spliteds2) {
        int cnt = my_string.split("0;
        ");for int answer = Integer.parseInt(splited[0]);
        
        for((int i = 1;0; i < splited.s1.length; i i++= 2)) {
            Stringfor op(int j = splited[i];0; intj num< =s2.length; Integer.parseInt(splited[ij++) + 1]);{
                if (op.s1[i].equals("+"s2[j])) {
                    answercnt++;
                    += num;break;
                } else if (op.equals("-")) {
                answer -= num;
            }
        }
        return answer;cnt;
    }
}
  • 중복 카운팅을 피하려면 break;를 해야 한다.
  • 문자열끼리 내용 비교는 .equals() 메서드를 사용해야 한다 ( == 은 주소값 비교)