개발놀이터

1장 문자열 주요 개념 복습 노트 본문

기타/코딩테스트

1장 문자열 주요 개념 복습 노트

마늘냄새폴폴 2023. 2. 9. 13:07

1-1. 문자 찾기

문자열에서 해당 문자가 몇개나 들어있나 세어보는 문제

String str = input.charAt(0);	// 문자열에서 한글자 한글자 떼어낼 때 사용

 

1-2. 대소문자 변환

소문자 -> 대문자, 대문자 -> 소문자로 변환하는 문제

Character 클래스의 toUpperCase, toLowerCase

 

1-3. 문장 속 단어

문장 속 가장 긴 단어를 찾아내는 문제

String answer = "";
int tmp = Integer.MIN_VALUE;
String[] str = input.split(" ");

for (String x : str) {
	if (tmp > str.length()) {
		tmp = str.length();
    	answer = x;
	}
}

 

1-4. 단어 뒤집기

good -> doog, Cool -> looC 이런식으로 단어를 뒤집는 문제

1. StringBuilder 클래스의 reverse 메서드를 이용하면 아주 간단하게 풀림
String str = new StringBuilder(input).reverse();

2. 일일이 수작업으로 뒤집는 알고리즘 lt, rt 의 개념 도입, A -> B, B -> A 로 바꾸는 알고리즘
int lt = 0, rt = input.length() - 1;

3. String -> char 배열로 바꾸는 toCharArray() 메서드

char[] c = input.toCharArray();
char tmp = '';

while (lt < rt) {
    
    tmp = c[lt];
    c[lt] = c[rt];
    c[rt] = tmp;
    
    lt++;
    rt--;
}

 

1-5. 특정 문자 뒤집기

알파벳과 특수문자가 섞여있는 문자열에서 특수문자는 무시하고 알파벳만 뒤집는 문제

1. lt, rt 개념 도입

2. 특수문자면 lt 와 rt 를 증가시키고 특수문자가 아니면 (알파벳이면 둘이 바꾸면 됨)

3. 특수문자인지 아닌지는 아스키코드로 확인

4. A-Z = 아스키코드 65~90 a-z = 아스키코드 97~122

if (c[lt] == 특수문자) {
	lt++;
}
else if (c[rt] == 특수문자) {
	rt--;
}
else {
	A -> B, B -> A 바꾸는 알고리즘 쓰면 됨
}

 

1-6. 중복문자 제거

ex) ksekkset -> kset 이렇게 중복되는 문자를 제거하는 문제

1. String 클래스의 indexOf 를 이용하면 아주 쉽게 풀림
cf) indexOf 란? char 타입 문자를 넣으면 문자열에서 어느 index에 위치하고 있는지 알려줌
ex)
String str = "Spring";
str.indexOf(S) = 0
str.indexOf(i) = 3

결과적으로 for 문을 돌려서 i 값과 indexOf로 반환되는 값이 같은 경우 무시하면 됨

ex) ksekkset
for (int i = 0 ; i < str.length() ; i++) {
	System.out.println(str.charAt(i) + " " + i + " " + str.indexOf(str.charAt(i)));
}

결괏값
k 0 0
s 1 1
e 2 2
k 3 0
k 4 0
s 5 1
e 6 2
t 7 7

if (i == str.indexOf(str.charAt(i))) {
	answer += str.charAt(i);
}

 

1-7. 회문 문자열

ex) gooG -> YES COOL -> NO 를 반환하게 하는 문제

StringBuilder 클래스의 revrse() 메서드를 사용한 후 equalsIgnoreCase 로 비교하면
대소문자와 관계없이 비교할 수 있다.

 

1-8. 유효한 회문 문자열

ex) time; found7, 7dnuof: emit -> YES 이렇게 특수문자, 공백은 무시하고 알파벳만 회문 문자열이 성립하는지 체크하는 문제

1. replaceAll + 정규표현식으로 간단하게 풀 수 있다. 

2. "[^A-Z]" = A 부터 Z 까지가 아닌 (특수문자나 공백인)
^ : ~가 아닌
A-Z : A 부터 Z 까지

 

1-9. 문자열에서 숫자 추출하기

ex) as0sd2qwer0ah8 -> 208 이렇게 문자열에서 숫자를 추출하는 문제

1. 0~9 까지의 아스키코드를 비교하며 간단한 방정식을 만드는 방법
0~9 까지의 아스키코드는 48~57
for (char x : str.toCharArray()) {
	if (x >= 48 && x <= 57) {
    	answer = answer * 10 + (x - 48);	// 여기서 x는 각각의 숫자
    }
}

2. Character 클래스의 isDigit() 메서드를 이용해 숫자인지 확인 할 수 있음
for (char x : str.toCharArray()) {
	if (Character.isDigit(x)) {
    	answer += x;
    }
}

 

1-10. 가장 짧은 문자 거리

ex study t -> 1 0 1 2 3 이렇게 문자열 s 를 입력받고 문자 t 를 입력받아 해당 문자까지 최단거리를 알아내야하는 문제

1. int 배열을 해당 문자 크기만큼 만들고

2. 배열 최대 크기보다 훨씬 큰 p 를 설정한 후에

3. 왼쪽에서 오른쪽으로 for 문을 돌면서 왼쪽 타겟까지의 거리를 잰다
t e a c h e r m o d e -> e
x 0 1 2 3 0 1 2 3 4 0 (x 는 매우 큰 수)

4. 다음엔 오른쪽에서 왼쪽으로 for 문을 돌리면서 오른쪽 타겟까지의 거리를 잰다 
이때 해당 값은 최소 값을 선택한다. 

int p = 1000;
int[] answer = new int[str.length()];

for (int i = 0 ; i < answer.length() ; i++) {
	if (answer[i] == t) {
    	p = 0;
        answer[i] = p;
    }
    else {
    	p++;
        answer[i] = p;
    }
}
p = 1000;
for (int i = answer.length() - 1 ; i >= 0 ; i--) {
	if (answer[i] == t) {
    	p = 0;
    }
    else {
    	p++;
        answer[i] = Math.min(answer[i], p);
    }
}

 

1-11. 문자열 압축

ex) KKHSSSSSSSE -> K2HS7E 이렇게 문자열을 압축하는 문제

1. 입력받는 문자에 빈칸을 하나 추가한다. 

2. charAt 을 이용해 i 번째 값과 i + 1 번째 값이 같으면 cnt를 1 올린다. 

3. i 번째 값과 i + 1 번째 값이 다르면 answer 에 해당 문자와 cnt 를 기록한다. 이때 cnt 가 1일
경우에는 숫자가 보이지 않도록 if(cnt > 1) 로직을 추가해준다. 

4. cnt 를 1로 초기화한다.

 

1-12. 2진 암호

ex) #은 1로 *은 0으로 바꾼뒤 2진수를 다시 10진수로 바꾸고 그걸 다시 문자로 바꿔서 암호를 할 것이다.

#**#**# = 1001001

1. 7개 단위로 substring 을 이용해 자른다. substring(0, 7)

2. replace 메서드를 이용해 # 은 1 로 * 은 0 으로 바꾼다. 

3. Integer 클래스의 parseInt 로 2진수를 10진수로 바꾼다. Integer 클래스의 valueOf 도 가능
Integer.parseInt(tmp, 2);
Integer.valueOf(tmp, 2);

4. 10진수로 바뀐 숫자를 char 형으로 캐스팅하면 문자로 바뀐다. 

5. 이어 붙이면 끝

cf) 10진수를 2진수로 바꾸고 싶은 경우 String 클래스의 toBinaryString 를 사용하면 된다
참고로 10진수 -> 8진수는 toOctalString, 10진수 -> 16진수는 toHexString

 

'기타 > 코딩테스트' 카테고리의 다른 글

2-3. 가위바위보  (0) 2023.02.14
2-2. 보이는 학생  (0) 2023.02.14
1-12. 2진 암호  (0) 2023.02.09
1-11. 문자열 압축  (0) 2023.02.09
1-10. 가장 짧은 문자 거리  (0) 2023.02.09