728x90
반응형
package StringBasic;
import java.util.HashSet;
import java.util.Set;
public class String1 {
public static void main(String[] args) {
String1 a = new String1();
String[] emails = {
"test.email+james@coding.com",
"test.e.mail+toto.jane@cod.ing.com",
"testemail+tom@cod.ing.com"};
System.out.println(a.solve_1(emails));
System.out.println(a.solve_substring(emails));
System.out.println(a.solve_split(emails));
}
//고유한 이메일
//로컬 네임 + 도메인 네임으로 구성되어 있다.
// 특정 문자 무시 -> Continue
// 특정 문자이후 문자열 무시 -> break
// 중복이 허용되지 않는 자료구조 -> Set<String>
//1.Basic
public int solve_1(String[] emails) {
//1. ds
//"test.email+james@coding.com",
Set<String> set = new HashSet<>();//수정된 문자열을 카운트하기 위한 자료구조 [중복불허용]
//2. for, while문
for(String email : emails) { //emails 배열에서 하나씩 email로 받아오기
//String을 조작하기 위한 메서드 : charAt
// -> String을 쪼개서 새로운 String으로 담는다.
String localName = makeLocalName(email); //test.email
String dName = makeDName(email); //james@coding.com
set.add(localName + "@" + dName);
}
return set.size();
}
private String makeLocalName(String email) {
StringBuilder sb = new StringBuilder();
//"test.email+james@coding.com"
//.빼고, +이후 삭제, @이후 도메인 네임이므로 제외
for(int i=0; i<email.length(); i++) {
if(email.charAt(i)=='.') {
continue;
}
if(email.charAt(i)=='+'||email.charAt(i)=='@') {
break;
}
sb.append(email.charAt(i));
}
return sb.toString(); //sb를 스트링으로 변환
}
private String makeDName(String email) {
//@이후 문자열 저장
return email.substring(email.indexOf("@")+1);
//문자열 저장-> substring메서드, @의 위치 확인 -> indexOf인데 @이후려면 +1
}
//2.substring와 index를 이용
public int solve_substring(String[] emails) {
int result = 0;
Set<String> set = new HashSet<>();
for(int i=0; i<emails.length; i++) {
String localName = "";
String domainName = "";
localName = emails[i].substring(0, emails[i].indexOf("+")).replace(".", "");
domainName = emails[i].substring(emails[i].indexOf("@"));
set.add(localName+domainName);
}
result = set.size();
return result;
//문제점 : a@coding.com인경우 불가능
}
//3. split
public int solve_split(String[] emails) {
//"test.email+james@coding.com"
//1.ds
Set<String> set = new HashSet<>();
//2. for, while
for(String email : emails) {
//"test.email+james@coding.com"
String[] parts= email.split("@"); //split은 String[]로 만든다.
//parts[0] : test.email+james, parts[1] : coding.com
String[] localName= parts[0].split("\\+"); //특수 문자는 그대로 사용이 불가능, \\를 붙여줘야한다.
//parts[0] : test.email
set.add(localName[0].replace(".", "")+"@"+parts[1]);
//parts[0] : testemail, parts[1] : coding.com
}
return set.size();
}
}
package StringBasic;
import java.util.HashSet;
import java.util.Set;
public class String2 {
public static void main(String[] args) {
String jewels = "aA", stones = "aAAbbbb";
System.out.println(solve(jewels, stones));
}
//보석과 돌
//대소문자를 구분해 문자열에 특정 문자가 몇개나 포함되어있는지 확인
//보석은 유니크 : set [중복 불허용], 돌은 for문 루프
//set의 값과 비교해 count
public static int solve(String jew, String stones) {
//1. ds
Set<Character> set = new HashSet<>(); //문자열이 아닌 문자 하나하나를 담기때문에 -> character
//2. for, while
char[] charArr= jew.toCharArray(); //보석에서 하나하나씩 빼야하므로 toCharArray
for(int i=0; i<charArr.length; i++) {
set.add(charArr[i]); //a,A
}
int count=0;
char[] stoneArr= stones.toCharArray(); //보석에서 하나하나씩 빼야하므로 toCharArray
for(int i=0; i<stoneArr.length; i++) {
if(set.contains(stoneArr[i])) { //돌 배열에서 보석의 set과 비교 -> 돌에서 보석이 포함되어있는지
count++;
}
}
return count;
}
}
package StringBasic;
public class String3 {
public static void main(String[] args) {
String str= "8F3Z-2e-9-wabcdef";
int k=4;
System.out.println(solve(str, k));
}
//라이센스 키 포맷
//숫자, 문자, 대시로만 구성된 문자열
//첫번째 배열은 기준 길이 제외, 모두 대문자, 기준길이마다 대시
//-없애기 : replace()
//대문자 만들기 : toUpperCase()
//문자열 나눠서, -넣기 : for문을 돌릴 때, 문자열의 뒤부터 길이 세기
public static String solve(String str, int k) {
//1. - 제거
String newStr= str.replace("-", "");
System.out.println("1: "+newStr);
//2. 대문자
newStr=newStr.toUpperCase();
System.out.println("2 : "+newStr);
//3. k개로 파싱하고, - 넣기
StringBuilder sb = new StringBuilder(newStr);//String을 조작하기 위한 그릇 생성
System.out.println("3: "+newStr);
int len=sb.length(); //8
//뒤에서 부터 세야한다. -> length를 알아내서 기준길이 k만큼 빼면 기준 길이가 나온다.
for(int i=k; i<len; i=i+k) { //i=k로 설정, 기준길이만큼씩 증가 i+k
System.out.println();
sb.insert(len-i, '-');
//길이에서 i만큼 빼서[i가 기준길이와 같을 때 시작, 기준길이 만큼씩 더해서 뻄] 거기에 -삽입
System.out.println("4 : "+sb);
}
return newStr;
}
}
package StringBasic;
public class String4 {
public static void main(String[] args) {
int[] digits = {1,2,3};
int[] result = solve(digits);
for(int i: result) {
System.out.println("val: "+i);
}
}
//플러스 원
//음이 아닌 비어있지 않은 배열 -> 배열 마지막에 +1
//뒷자리부터 [length의 마지막 번호부터] 체크
//값이 10이 되면, carry=1로 맨앞자리에 추가
public static int[] solve(int[] digits) {
int n=digits.length; //3
for(int i=n-1;i>=0;i--) {//2번방부터
//2,1,0순으로
//1,2,3 / 9,9,9
digits[i]++; //1,2,4 /9,9,10
if(digits[i]<10) { //1,2,4: 10보다 작을 경우 그대로
return digits;
}
digits[i]=0;
//9,9,10 : 1,0,0,0이 되어야하므로 -> 모든 i에 0넣고, 1추가
}
int[] result =new int[n+1]; //0,0,0,0
result[0] = 1;
return result;
}
}
728x90
반응형
'Java > Java 알고리즘' 카테고리의 다른 글
[Java 기본 알고리즘] (4) 투 포인터 (0) | 2022.01.04 |
---|---|
[Java 기본 알고리즘] (2) 정렬 탐색 (0) | 2022.01.03 |
[Java 기본 알고리즘] (3) Array (0) | 2022.01.03 |
[Java] String 메서드 (0) | 2021.12.30 |
[Java] Casting (형 변환) (0) | 2021.11.25 |