본문 바로가기

Java/Java 알고리즘

[Java 기본 알고리즘] (1) String

반응형


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;
		}
	

	
	
	
}
반응형