📖 문제
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
⛔ 제한 조건
- s의 길이는 1 이상 5 이하입니다.
- s의 맨 앞에는 부호(+, -)가 올 수 있습니다.
- s는 부호와 숫자로만 이루어져 있습니다.
- s는 "0"으로 시작하지 않습니다.
💻 입출력 예
예를 들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
• String의 특성
String은 char의 배열이므로, 배열처럼 사용해도 될 것이라고 생각했습니다.
하지만 String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체입니다.
직접 배열 인덱스를 사용할 수 없고, charAt() 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.
s[i]와 같은 배열 인덱스 접근은 컴파일 오류를 발생시킵니다.
class Solution {
public int solution(String s) {
int answer = 0;
for (int i = 1; i < s.length; i++) {
if (s[0] == '+') {
answer = s[i] * (10 ^ (s.length - 1 - i));
} else {
answer = (-1) * s[i] * (10 ^ (s.length - 1 - i));
}
}
return answer;
}
}
• 첫 번째 오류


• 오류 발생 원인 및 해결 방안
1) 문자열에서 길이를 조회할 때, length가 아닌 length() 메서드를 이용합니다.
문자열(String)에서 길이값을 확인할 때, length() 메서드를 이용합니다.
🔎 length vs length() vs size()
: 길이값 가져오기
1. length
• arrays(int[], double[], String[])
• length는 배열의 길이를 조회합니다.
2. length()
• String related Object(String, StringBuilder etc)
• length()는 문자열의 길이를 조회합니다. (ex. “ABCDE”.length() == 5)
3. size()
• Collection Object(ArrayList, Set etc)
• size()는 컬렉션 타입 목록의 길이를 조회합니다.
2) String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체로, 배열의 인덱스를 직접 사용할 수 없고 `charAt()` 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.
배열 인덱스로의 접근은 컴파일 오류를 발생시킵니다.
• 수정 코드
class Solution {
public int solution(String s) {
int answer = 0;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(0) == '+') {
answer = s.charAt(i) * (10 ^ (s.length() - 1 - i));
} else {
answer = (-1) * s.charAt(i) * (10 ^ (s.length() - 1 - i));
}
}
return answer;
}
}
• 두 번째 문제 발생

• 문제 발생 원인
- 문자열의 맨 앞에는 부호'만' 올 수 있는 것이 아니라, 부호'도' 올 수 있는 것입니다.
→ 맨 앞에 부호가 아닌 숫자가 오는 경우도 고려해줘야 합니다. - for문에서 각 자리의 값들이 누적 처리되어야 합니다.
- charAt() 메서드를 사용하여 읽어온 값은 숫자형이 아닌 문자형 char입니다.
→ 숫자형으로 변환해줘야 합니다.
• 두 가지 해결 방안
1) ASCII code를 사용하여, char형을 int형으로 변환시켜줍니다.
2) Character.getNumericValue() 메서드를 이용하여, 숫자 형태의 char형을 int형으로 변환시켜줍니다.
2) 문자열을 숫자형으로 한 번에 변환시켜주는 메서드를 사용합니다.
1) ASCII code를 사용하여, char형을 int형으로 변환
class Solution {
public int solution(String s) {
int answer = 0;
int sign = 0; // 부호를 저장하는 변수; -1, 1
int num = 0; // 값을 저장하는 변수
for (int i = 0; i < s.length(); i++) {
/* 부호 처리 과정 */
if (i == 0) {
// 문자열의 맨 앞에 부호가 있는 경우
if (s.charAt(0) == '-') {
sign = -1;
} else if (s.charAt(0) == '+') {
sign = 1;
}
// 문자열의 맨 앞에 부호가 없는 경우; 양수
else {
sign = 1;
num = (s.charAt(i) - '0') * (10 ^ (s.length() - 1));
}
}
/* 값 처리 과정 */
else {
num += (s.charAt(i) - '0') * (10 ^ (s.length() - 1 - i));
}
System.out.println(sign + ", " + num + " "); // 올바른 값으로 실행되었는지 출력
}
answer = sign * num;
return answer;
}
}
• 문제 발생 (1)

• 문제 발생 원인 및 해결 방안
: `^`는 비트 XOR 연산으로, Java에서 제곱 연산을 할 때는 Math.pow() 메서드를 이용해야 합니다.
• Math.pow() 메서드
public static double Math.pow(double base, double exponent)
• 수정 코드
class Solution {
public int solution(String s) {
int answer = 0;
int sign = 0; // 부호를 저장하는 변수; -1, 1
int num = 0; // 값을 저장하는 변수
for (int i = 0; i < s.length(); i++) {
/* 부호 처리 과정 */
if (i == 0) {
// 문자열의 맨 앞에 부호가 있는 경우
if (s.charAt(0) == '-') {
sign = -1;
} else if (s.charAt(0) == '+') {
sign = 1;
}
// 문자열의 맨 앞에 부호가 없는 경우; 양수
else {
sign = 1;
num = (s.charAt(i) - '0') * Math.pow(10, s.length() - 1);
}
}
/* 값 처리 과정 */
else {
num += (s.charAt(i) - '0') * Math.pow(10, s.length() - 1 - i);
}
System.out.println(sign + ", " + num + " "); // 올바른 값으로 실행되었는지 출력
}
answer = sign * num;
return answer;
}
}
• 문제 발생 (2)

• 발생 원인 및 해결 방안
: Math.pow() 값은 double형으로 반환됩니다.
제한 조건에 의해 int형으로도 충분히 값 손실이 잃어나지 않게 연산이 가능하므로 강제 형변환을 해줍니다.
• 수정 코드
class Solution {
public int solution(String s) {
int answer = 0;
int sign = 0;
int num = 0;
for (int i = 0; i < s.length(); i++) {
/* 부호 처리 과정 */
if (i == 0) {
// 문자열의 맨 앞에 부호가 있는 경우
if (s.charAt(0) == '-') {
sign = -1;
} else if (s.charAt(0) == '+') {
sign = 1;
}
// 문자열의 맨 앞에 부호가 없는 경우; 양수
else {
sign = 1;
num = (s.charAt(i) - '0') * (int) Math.pow(10, s.length() - 1);
}
}
/* 값 처리 과정 */
else {
num += (s.charAt(i) - '0') * (int) Math.pow(10, s.length() - 1 - i);
}
}
answer = sign * num;
return answer;
}
}
2) Character.getNumericValue() 메서드 - 숫자 형태의 char형을 int형으로 변환
🔎 문자형 char 타입의 숫자를 int형으로 변환시켜주는 메서드
Character.getNumericValue() 메서드
public static int Character.getNumericValue(char ch)
class Solution {
public int solution(String s) {
int answer = 0;
int sign = 0;
int num = 0;
for (int i = 0; i < s.length(); i++) {
if (i == 0) {
if (s.charAt(0) == '-') {
sign = -1;
} else if (s.charAt(0) == '+') {
sign = 1;
} else {
sign = 1;
num = Character.getNumericValue(s.charAt(i)) * (int) Math.pow(10, s.length() - 1);
}
} else {
num += Character.getNumericValue(s.charAt(i)) * (int) Math.pow(10, s.length() - 1 - i);
}
}
answer = sign * num;
return answer;
}
}
3) Integer.parseInt() - 문자열을 숫자형으로 변환하는 메서드
🔎 문자열 String 타입의 숫자를 숫자형 타입으로 변환시켜주는 메서드
Byte.parseByte()
Short.parseShort()
Integer.parseInt()
Long.parseLong()
Float.parseFloat()
Double.parseDouble()
class Solution {
public int solution(String s) {
int answer = 0;
answer = Integer.parseInt(s);
return answer;
}
}

• TIL
1. length vs length() vs size()
: 길이값 가져오기
1) length
- arrays(int[], double[], String[])
- length는 배열의 길이를 조회합니다.
2) length()
- String related Object(String, StringBuilder etc)
- length()는 문자열의 길이를 조회합니다. (ex. “ABCDE”.length() == 5)
3) size()
- Collection Object(ArrayList, Set etc)
- size()는 컬렉션 타입 목록의 길이를 조회합니다.
2. String 클래스
String은 다양한 메서드로 문자열을 조작하고 접근할 수 있도록 설계된 객체입니다.
직접 배열 인덱스를 사용할 수 없고, charAt() 메서드를 사용해서 특정 인덱스의 문자에 접근해야 합니다.
s[i]와 같은 배열 인덱스 접근은 컴파일 오류를 발생시킵니다.
[주요 메서드]
1) 문자 접근 및 변환
- charAt(int index): 해당 인덱스에 위치한 문자 반환
- length(): 문자열의 길이 반환
- substring(int beginIndex): 지정된 인덱스부터 끝까지의 부분 문자열 반환
- substring(int beginIndex, int endIndex): 주어진 인덱스 범위의 부분 문자열 반환
- toCharArray(): 문자열을 char 배열로 변환
2) 검색 및 비교
- indexOf(String str): 주어진 문자열이 처음 나타나는 인덱스 반환
- lastIndexOf(String str): 주어진 문자열이 마지막으로 나타나는 인덱스 반환
- equals(Object obj): 두 문자열의 내용이 같은지 비교
- equalsIgnoreCase(String anotherString): 대소문자를 무시하고 비교
3) 변환 및 조작
- toLowerCase(): 문자열을 소문자로 변환
- toUpperCase(): 문자열을 대문자로 변환
- trim(): 문자열의 앞과 뒤의 공백 제거
- replace(char oldChar, char newChar): 특정 문자를 다른 문자로 교체
- replaceAll(String regex, String replacement): 정규 표현식에 따라 문자열을 교체
4) 형식화
- format(String format, Object... args): 형식화된 문자열 생성
5) 기타
- split(String regex): 주어진 정규 표현식에 따라 문자열을 나누어 배열로 반환
- contains(CharSequence sequence): 특정 문자열이 포함되어 있는지 확인
3. Math.pow() 메서드
public static double Math.pow(double base, double exponent)
4. Character.getNumericValue() 메서드
public static int Character.getNumericValue(char ch)
5. Integer.parseInt() 메서드
public static int Integer.parseInt(String s)
'💻 Code Kata > Algorithm' 카테고리의 다른 글
| [프로그래머스][코딩테스트 연습][Java] 약수의 합 / 약수 구하기 (0) | 2024.09.06 |
|---|---|
| [프로그래머스][코딩테스트 연습][Java] 평균 구하기 / length, length(), size() 의 차이점 (0) | 2024.09.05 |
| [프로그래머스][코딩테스트 연습][Java] 짝수와 홀수 / 음수의 나눗셈 처리 (1) | 2024.09.05 |