📑
문자열 메서드
char | charAt(int index) | 특정 위치의 문자를 리턴합니다. |
boolean | equals(Object anObject) | 두 문자열을 비교합니다. |
byte[] | getBytes() | byte[]로 리턴합니다. |
byte[] | getBytes(Charset charset) | 주어진 문자셋으로 인코딩한 byte[]로 리턴합니다. |
int | indexOf(String str) | 문자열 내에서 주어진 문자열의 위치를 리턴합니다. |
int | length() | 총 문자의 수를 리턴합니다. |
String | replace(CharSequence target, CharSequence replacement) | target 부분을 replacement로 대치한 새로운 문자열을 리턴합니다. |
String | substring(int beginIndex) | beginIndex 위치에서 끝까지 잘라낸 새로운 문자열을 리턴합니다. |
String | substring(int beginIndex, int endIndex) | beginIndex 위치에서 endIndex 전까지 잘라낸 새로운 문자열을 리턴합니다. |
String | toLowerCase() | 알파벳 소문자로 변환한 새로운 문자열을 리턴합니다. |
String | toUpperCase() | 알파벳 대문자로 변환한 새로운 문자열을 리턴합니다. |
String | trim() | 앞뒤 공백을 제거한 새로운 문자열을 리턴합니다. |
String | valueOf(int i) valueOf(double d) |
기본 타입 값을 문자열로 리턴합니다. |
배열을 문자열로 변환하기
배열을 문자열로 변환 - Arrays.toString( )
char 배열을 문자열로 변환 - String.valueOf( )new String( )
문자열을 char로 변환 - toCharArray( )
삼항연산자
조건 ? 참인 경우 반환 값 : 거짓인 경우 반환 값
class Solution {
public int solution(int num, int n) {
int answer = 0;
if (num%n == 0){
answer = 1;
}
else answer = 0;
return answer;
}
}
위와 같은 코드를 삼항연산자를 사용해 나타낼 수 있다.
class Solution {
public int solution(int num, int n) {
int answer = num%n==0?1:0;
return answer;
}
}
코드가 정말 간결해진다.😎
(조건 여러개 넣기도 가능)
if-else문과 switch-case문 비교
public int solution(String ineq, String eq, int n, int m) {
int answer = 0;
if (ineq.equals("<") && eq.equals("="))
answer = (n <= m)==true ? 1 : 0;
else if (ineq.equals(">") && eq.equals("="))
answer = (n >= m)==true ? 1 : 0;
else if (ineq.equals("<") && eq.equals("!"))
answer = (n < m)==true ? 1 : 0;
else if (ineq.equals(">") && eq.equals("!"))
answer = (n > m)==true ? 1 : 0;
return answer;
}
↳ if-else문 예시
public int solution(String ineq, String eq, int n, int m) {
int answer = 0;
String q = ineq + eq;
switch (q) {
case "<=":
answer = (n <= m) ? 1 : 0;
break;
case ">=":
answer = (n >= m) ? 1 : 0;
break;
case "<!":
answer = (n < m) ? 1 : 0;
break;
case ">!":
answer = (n > m) ? 1 : 0;
break;
default:
answer = 0;
break;
}
return answer;
}
↳ switch-case문 예시
if-else문은 원하는 조건이 나올 때까지 순차적으로 모든 경우를 비교하지만
switch-case문은 jump-table을 사용해 한번에 원하는 지점으로 이동해 비교한다.
그래서 일반적으로 switch-case문이 더 성능이 좋은 것으로 알려져 있으나 상황에 따라 다를 수 있다.
if-else문이 더 빠른 경우
- 간단한 조건: 조건이 매우 간단하고 case의 수가 적다면 if-else 문이 더 빠를 수도 있습니다. 컴파일러가 점프 테이블을 생성하는 오버헤드가 발생할 수 있기 때문.
- 복잡한 조건: case 내부의 코드가 복잡하거나, 여러 개의 case를 합쳐야 하는 경우 if-else 문이 더 유연하게 사용될 수 있음.
특징 | switch-case | if-else |
비교 대상 | 단일 표현식 | 다양한 표현식 |
조건 | 정확한 일치 | 다양한 조건 (비교, 논리 연산 등) |
구조 | 명확하고 간결 | 유연하지만 복잡해질 수 있음 |
성능 | 일반적으로 빠름 | 조건의 복잡성에 따라 달라짐 |
사용 시나리오 | 정확한 값 비교, 여러 개의 가능한 값 | 복잡한 조건, 범위 비교, 불리언 표현식 |
ALGORITHM CODE KATA
Ⅰ. 길이가 같은 두 문자열 str1과 str2가 주어집니다. 두 문자열의 각 문자가 앞에서부터 서로 번갈아가면서 한 번씩 등장하는 문자열을 만들어 return 하는 solution 함수를 완성해 주세요. (school.programmers.co.kr)
처음 작성한 코드↴
class Solution {
public String solution(String str1, String str2) {
String answer[] = new String[str1.length()*2];
for(int i=0; i < str1.length()*2; i++){
if(i%2==0){
answer[i] = Character.toString(str1.charAt(i/2));
}
else{
answer[i] = Character.toString(str2.charAt(i/2));
}
}
return String.join("", answer);
}
}
class Solution {
public String solution(String str1, String str2) {
String answer = "";
for(int i = 0; i < str1.length(); i++){
answer+= str1.charAt(i);
answer+= str2.charAt(i);
}
return answer;
}
}
이전 글에서도 정리한 내용이지만 다시한번... 참고 → JAVA - StringBuilder
자바는 + 연산으로 문자열을 합칠 수 있다. 하지만 + 연산을 할 때마다 그 횟수만큼 StringBuilder 객체가 생성되고 append()와 toString() 메서드의 호출이 매번 발생하게 되므로 성능 저하와 메모리의 낭비를 초래한다. 따라서 간단한 코드의 경우 이렇게 작성해도 무리는 없지만 StringBuilder 클래스를 사용하는 것이 권장된다.
StringBuilder를 사용한 코드↴
class Solution {
public String solution(String str1, String str2) {
StringBuilder answer = new StringBuilder();
for (int i = 0; i < str1.length(); i++) {
answer.append(str1.charAt(i));
answer.append(str2.charAt(i));
}
return answer.toString();
}
}
Ⅱ. 연산 ⊕는 두 정수에 대한 연산으로 두 정수를 붙여서 쓴 값을 반환합니다. 예를 들면 다음과 같습니다. 12 ⊕ 3 = 123
양의 정수 a와 b가 주어졌을 때, a ⊕ b와 2 * a * b 중 더 큰 값을 return하는 solution 함수를 완성해 주세요. 단, a ⊕ b와 2 * a * b가 같으면 a ⊕ b를 return 합니다. (school.programmers.co.kr)
# 문자열로 정수 a, b를 이어붙인 후 다시 정수로 변환해서 푸는 방법
class Solution {
public int solution(int a, int b) {
int answer = 0;
String sa = String.valueOf(a);
String sb = String.valueOf(b);
answer = Math.max(Integer.valueOf(sa+sb), 2*a*b);
return answer;
}
}
다른 풀이↴
# parseInt를 사용해 두 정수를 바로 이어 붙이는 방법
class Solution {
public int solution(int a, int b) {
int answer = 0;
int ab = Integer.parseInt(a+""+b);
answer = Math.max(ab, 2*a*b);
return answer;
}
}
자바에서는 + 연산자를 사용하여 문자열과 정수, 실수 등을 연결할 수 있다. 위 코드는 이를 이용하여 별도로 정수를 문자열로 변환하지 않고 바로 연결한 후, Integer.parseInt를 사용해 다시 정수형으로 변환한 것이다.
Ⅲ. 단어가 공백 한 개 이상으로 구분되어 있는 문자열 my_string이 매개변수로 주어질 때, my_string에 나온 단어를 앞에서부터 순서대로 담은 문자열 배열을 return 하는 solution 함수를 작성해 주세요. (school.programmers.co.kr)
class Solution {
public String[] solution(String my_string) {
String[] answer = my_string.split(" ");
return answer;
}
}
이렇게 작성하면 공백이 여러개가 연달아 나오는 경우, 배열에 공백이 담긴다. 이를 피하기 위해서는 다음와 같이 정규표현식으로 나타내면 된다.
class Solution {
public String[] solution(String my_string) {
String[] answer = my_string.trim().split("\\s+");
return answer;
}
}
trim() -> 문자열의 앞뒤 공백 제거
split("\\s+") -> 문자열을 한 개 이상의 공백을 기준으로 나눔.
Ⅳ. 숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.
예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다. (school.programmers.co.kr)
class Solution {
public int solution(String t, String p) {
int answer = 0;
int tl = t.length();
int pl = p.length();
long int_p = Long.parseLong(p);
for(int i=0; i <= tl - pl; i++) {
String temp = t.substring(i, i + pl);
long int_temp = Long.parseLong(temp);
if (int_temp <= int_p) {
answer++;
}
}
return answer;
}
}