JAVA 문법
- replaceAll( ) : 문자열을 원하는 문자열로 변경
보통 정규식 표현과 같이 사용
ex) str="*AFC$FG"
str=str.replaceAll("[^A-Z]","") // A-Z가 아니라면 공백처리
// 출력 AFCFG
- Character.isDigit(c) : return boolean (Chracter값이 숫자인지 확인)
- Integer.parseInt(str) : str -> int로 변경
- Integer.toString(int) : int -> str로 변경
- 절대값 Math.abs(i-j) // 거리구할때 사용
- trim() : 앞뒤 공백 제거
ex) str=" 1 2 3 4 "
str=str.trimp(); //"1 2 3 4"
- relace() or replaceAll() : 가운데 공백 제거
String str1 = " By default ";
String result1 = str1.replaceAll(" ", ""); //Bydefault
- Math.pow(2, 지수승) // return은 double, int로 캐스팅해서 사용
- Character.getNumericValue(char) : Character -> Int로 변경
문제 1
배운점
- replaceAll( )를 이용한 정규표현식
- 특수문자 제거
- 펠린드롬
코드
package inflearn.section1_string;
import java.util.*;
public class Main8 {
public String solution(String str) {
String answer="YES";
str=str.toUpperCase();
str=str.replaceAll("[^A-Z]","");
StringBuilder sb=new StringBuilder(str).reverse();
String reverse_sb=sb.toString();
if (!str.equals(reverse_sb)) {
answer="NO";
}
return answer;
}
public static void main(String[] args) {
Main8 main =new Main8();
Scanner scan=new Scanner(System.in);
System.out.println(main.solution(scan.nextLine()));
}
}
문제 2
배운점
- 왼쪽부터 갱신
- 오른쪽부터 갱신하여 가장 최선의 값을 찾는다.
해결 방법
- 시간 복잡도 : n^2
- 찾을려고 하는 문자의 인덱스를 arraylist에 저장
// e의 위치를 다 저장
- 문자열의 인덱스를 하나씩 꺼내면서 arraylist에 저장되어 있는 것과 abs(절대값)비교 후 짧은 것 찾음
- 찾은 값을 배열에 저장
- 알고리즘 (강의)
- 왼쪽의 타겟과 비교 후 오른쪽의 타겟과의 거리를 비교
- 이때 p값을 1000으로 설정하여 가장 e가 멀리 있다고 가정하는게 중요
- 시간 복잡도 : n
- p를 가장 먼 값 이라고 생각 p=1000
왼쪽부터 탐색
찾을려고 하는 값이 target과 같으면 p를 0으로 초기화
다르면 p를 1증가
- 오른쪽부터 탐색
p=1000
찾을려고 하는 값이 target과 같으면 p를 0으로 초기화
다르면 p를 증가시키고 기존 왼쪽 탐색의 있는 값과 비교 (둘중 가장 작은것 선택)
코드
package inflearn.section1_string;
import java.util.*;
public class Main10 {
public void solution1(String str) {
String []temp=str.split(" ");
String answer="";
char []arr_temp=temp[0].toCharArray();
char e=temp[1].charAt(0);
ArrayList<Integer>arr=new ArrayList<>();
for (int i=0;i<arr_temp.length;i++) {
if (arr_temp[i]==e) {
arr.add(i);
}
}
for (int i=0;i<arr_temp.length;i++) {
int tmp=Integer.MAX_VALUE;
for (Integer j:arr) {
int k=Math.abs(i-j);
if (tmp>k) {
tmp=k;
}
}
answer+=Integer.toString(tmp)+" ";
}
answer=answer.trim();
System.out.println(answer);
}
public void solution2(String str) {
String []temp=str.split(" ");
String answer="";
char []arr_temp=temp[0].toCharArray();
char e=temp[1].charAt(0);
int [] ans=new int[arr_temp.length];
int p=1000;
for (int i=0;i< arr_temp.length;i++) {
if (arr_temp[i]==e) {
p=0;
}
else {
p++;
}
ans[i]=p;
}
System.out.println(Arrays.toString(ans));
p=1000;
for (int i= arr_temp.length-1;i>=0;i--) {
if (arr_temp[i]==e) {
p=0;
}
else {
p++;
int val=Math.min(p,arr_temp[i]);
ans[i]=val;
}
}
System.out.println(Arrays.toString(ans));
}
public static void main(String[] args) {
Main10 main =new Main10();
Scanner scan=new Scanner(System.in);
main.solution2(scan.nextLine());
}
}
문제 3
해결방법
- while안에 for를 이용하여 해결
- while은 인덱스 순서대로 접근, for는 몇개 반복되었는지 찾기
- for에서 반복된 만큼 lt를 이동
코드
package inflearn.section1_string;
import java.util.*;
public class Main11 {
public String solution(String str) {
String answer="";
int lt=0;
int rt=str.length();
char []temp=str.toCharArray();
while (lt<rt) {
int tmp=1;
char val=temp[lt];
for (int i=lt+1;i<rt;i++) {
if (val==temp[i]) {
tmp++;
}
else {
break;
}
}
String data=""+val;
if (tmp!=1) {
data+=Integer.toString(tmp);
}
answer+=data;
lt=lt+tmp;
}
return answer;
}
public static void main(String[] args) {
Main11 main =new Main11();
Scanner scan=new Scanner(System.in);
System.out.println(main.solution(scan.next()));
}
}
문제 4
해결방법
- '#', '*'를 1 or 0으로 변경
- 7개씩 문자 자르고 ss에 저장 ex) 1000011
- ss를 2진법으로 변경하고 answer에 (char)로 저장
- (int)Math.pow(2,지수승) -> 2**3 =8
코드
package inflearn.section1_string;
import java.util.*;
public class Main12 {
public String solution(int num, String str) {
char []temp=str.toCharArray();
for (int i=0;i<temp.length;i++) {
if (temp[i]=='#') {
temp[i]='1';
}
else {
temp[i]='0';
}
}
String answer="";
for (int i=0;i<num;i++) {
String ss="";
for (int j=0;j<7;j++) {
ss+=temp[7*i+j];
}
char ans[]=ss.toCharArray();
int value=0;
int multi=6;
for (int k=0;k<=6;k++) {
int b=(int)Math.pow(2,multi);
int val=Character.getNumericValue(ans[k]);
value+=b*val;
multi--;
}
answer+=(char)value;
}
return answer;
}
public static void main(String[] args) {
Main12 main =new Main12();
Scanner scan=new Scanner(System.in);
int num=scan.nextInt();
String str=scan.next();
System.out.println(main.solution(num,str));
}
}
REF