본문 바로가기

Java/Java 알고리즘 프로그래머스

[리뷰] 해결 못한 알고리즘 다시 풀기 -1

728x90
반응형

1. 중복문자 제거 - 여러가지 방법 이용

(1) StringBuilder 이용

import java.util.Scanner;

public class Main {
	//# 중복문자제거 -> 직접 탐색 제거와 set이용 [set이 좋음]
	// 소문자의 문자열의 중복된 문자를 제거하고, 출력하는 프로그램
	// 제거된 문자는 순서를 유지
	// char/char[] -> String : String.valueOf(c)
	//ksekkset -> kset

	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		String a = kb.next();
		System.out.println(solution(a));
		kb.close();
	}

	static String solution(String a) {
		//1.ds
		//char[] arr = a.toCharArray();
		StringBuilder sb = new StringBuilder();
		int n = a.length();
		String answer="";
		
		//2.for, while
		//-> i와 index는 같이 증가하는 원리 이용
		
		for (int i = 0; i < n; i++) {
			char target=a.charAt(i);
			//타겟 지정
			int index=a.indexOf(target);
			//인덱스 저장
			if(i==index) {
				sb.append(target);
				//i와 index가 같을때만 저장
			}
		}
		
		answer=sb.toString();
		return answer;
	}
}

 

(2) 배열과 ArrayList이용

import java.util.*;
  
public class Main {
  public String solution(String str){
    ArrayList<Character> list = new ArrayList<>();
    char [] arr = str.toCharArray();
    String answer="";

	list.add(arr[0]);
    //첫번째는 넣고, 그 다음부터 확인 후 없으면 list의 마지막에 추가한다.
    
    for(int i=0;i<str.length(); i++){
      for(int j=0;j<list.size(); j++){
        if(arr[i]==list.get(j))
          break;
        if(j==list.size()-1) list.add(arr[i]);
      }
    }
    for(char x : list) answer+=x;
    
    return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String str = kb.next();
    
    System.out.println(T.solution(str));
  }
}

 

(3) set 이용

import java.util.*;
  
public class Main {
  public String solution(String str){
    char [] arr = str.toCharArray();
    Set<Character> set  = new LinkedHashSet<>();
    for(int i=0;i<str.length();i++){
      set.add(arr[i]);
    }
    String answer="";
    for(char x: set) answer+=x;
    return answer;
  }
  public static void main(String[] args){
    Main T = new Main();
    Scanner kb=new Scanner(System.in);
    String str = kb.next();
    
    System.out.println(T.solution(str));
  }
}

 

(4) map 이용

(4-1) Map.Entry 이용

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		Map <Character, Integer> map = new LinkedHashMap<>();
		for(char x: str.toCharArray()) {
			map.put(x, map.getOrDefault(x, 0)+1);
		}
		for(Map.Entry<Character, Integer> entry: map.entrySet()) {
			char key = entry.getKey();
			answer+=key;
		}
		
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

(4-2) Iterator 이용

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class Main {
	public String solution(String str) {
		String answer = "";
		Map <Character, Integer> map = new LinkedHashMap<>();
		for(char x: str.toCharArray()) {
			map.put(x, map.getOrDefault(x, 0)+1);
		}
		Set <Character> set= map.keySet();
        Iterator<Character> lt1 = set.iterator();
        while(lt1.hasNext()) {
            char key = ((char) lt1.next());
            answer+=key;
        }
		
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

 

+) 세련된 풀이

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		for (int i = 0; i < str.length(); i++) {
			if (str.indexOf(str.charAt(i)) == i)
				answer += str.charAt(i);

		}
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

 

2. 유효한 팰린드롬 -정규식

import java.util.Scanner;

//유효한 팰린드롬
//앞에서 읽을 때나 뒤에서 읽을 때 같은 문자열
//알파벳만을 이용해 회문을 검사하고, 대소문자를 구분하지 않는다.

public class Main {
	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		String a = kb.nextLine();
		//한줄읽기 : nextLine, 한단어읽기 : next, 한숫자읽기 : nextInt
		a=a.toLowerCase();
		//소문자화 : toLowerCase, 대문자화 : toUpperCase
		System.out.println(solution(a));
		kb.close();
	}
	static String solution(String a) {
		StringBuilder sb = new StringBuilder();
		char[] chararr= a.toCharArray();
		//String을 char[]로
		
		int n=a.length();
		String result="";
		String reverse="";
		String answer="NO";
		
		for(int i=0;i<n;i++) {
			if(Character.isLetter(chararr[i])) {
				sb=sb.append(chararr[i]);
			}
		}
		result=sb.toString();
		reverse=sb.reverse().toString();
		if(result.equals(reverse)) {
			return "YES";
		}
		else
			return answer;
		
	}

}

 

+) 세련된 풀이

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "YES";
		StringBuilder sb = new StringBuilder();

		str = str.toUpperCase().replaceAll("[^A-Z]", "");
		String tmp = sb.append(str).reverse().toString();
		if (str.equals(tmp))
			return answer;
		else
			return answer = "NO";

	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.nextLine();

		System.out.println(T.solution(str));

	}
}

 

 

3. 가장 짧은 문자거리

import java.util.*;

public class Main {
	public int[] solution(String str, char s) {
		ArrayList<Integer> list = new ArrayList<>();
		int[] arr = new int[str.length()];
		for (int i = 0; i < str.length(); i++) {
			if (s == str.charAt(i))
				list.add(i);
		}
		for (int i = 0; i < str.length(); i++) {
			int min = Integer.MAX_VALUE;
			for (int j : list) {

				min = Math.min(min, Math.abs(j - i));
				if (Math.abs(j - i) == min)
					arr[i] = min;
			}
		}

		return arr;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		char s = kb.next().charAt(0);
		for (int x : T.solution(str, s))
			System.out.print(x + " ");

	}
}

 

4. 문자열 압축

import java.util.Scanner;

public class Main {
	public String solution(String str) {
		String answer = "";
		char[] arr = str.toCharArray();
		int n = 1;
		for (int i = 0; i < arr.length; i++) {
			if (i != arr.length - 1 && arr[i] == arr[i + 1]) {
				n++;
			} else {
				answer += arr[i];
				if (n > 1)
					answer += n;
				n = 1;
			}
		}
		return answer;

	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

+) 세련된 풀이

import java.util.*;

class Main {
	public String solution(String s) {
		String answer = "";
		s = s + " ";
		int cnt = 1;
		for (int i = 0; i < s.length() - 1; i++) {
			if (s.charAt(i) == s.charAt(i + 1))
				cnt++;
			else {
				answer += s.charAt(i);
				if (cnt > 1)
					answer += String.valueOf(cnt);
				cnt = 1;
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String str = kb.next();
		System.out.println(T.solution(str));
	}
}

char [] to String 변환 메서드

1. charAt()

2. toCharArray()

 

str.charAt(i)

: String의 i번째 문자

 

str.indexOf( "찾을 특정 문자" , "시작할 위치" ) 

:String에서 문자가 a인 위치

 

String.valueOf(i)

: int to String 변환

 

 

5. 암호

import java.util.Scanner;
  
public class Main {
  public static void main(String[] args){
    Scanner kb=new Scanner(System.in);
    int n = kb.nextInt();
    String str = kb.next();
    str = str.replace("#","1");
    str = str.replace("*","0");
    
    int tmp=0;
    String answer="";
    for(int i=0;i<n;i++){
      tmp=Integer.parseInt(str.substring(i*7,(1+i)*7),2);
      answer+=(char)tmp;
    }
    System.out.println(answer);
    
  }

}

 

+) 세련된 풀이

import java.util.*;

class Main {
	public String solution(int n, String s) {
		String answer = "";
		for (int i = 0; i < n; i++) {
			String tmp = s.substring(0, 7).replace('#', '1').replace('*', '0');
			int num = Integer.parseInt(tmp, 2);
			answer += (char) num;
			s = s.substring(7);
		}
		return answer;
	}

	public static void main(String[] args) {
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		String str = kb.next();
		System.out.println(T.solution(n, str));
	}
}

아스키 to Char 변환

(char) 아스키코드

 

0부터 7까지 자르기

substring(0,7)

 

String to Int 변환하는데 2진수를 10진수로

int num=Integer.parseInt(tmp, 2);


1. 임시반장정하기

package array.ch02;

import java.util.*;

class Array11_S {
	static int solution(int n, int[][] arr) {
		int answer = 0, max = 0;
		for (int i = 1; i <= n; i++) {
			int cnt = 0;
			for (int j = 1; j <= n; j++) {
				for (int k = 1; k <= 5; k++) {
					if (arr[i][k] == arr[j][k]) {
						cnt++;
						break;
					}
				}
			}
			if (cnt > max) {
				max = cnt;
				answer = i;
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		int[][] arr = new int[n + 1][6];
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= 5; j++) {
				arr[i][j] = kb.nextInt();
			}
		}
		System.out.print(solution(n, arr));
	}
}

 

 

2. 멘토링

 

package array.ch02;

import java.util.Scanner;

//멘토링
//4중 for문
//열 : 0등 1등 2등 3등 => 1~n
//행 : 0번 1번 2번 => 1~n

//i : 1 ~ 4
//j : 1 ~ 4
//총 경우의 수 = 16개 => 이중 for문 필요
//이 경우의 수 중에, 테스트 모두에서 앞서는지 확인 => 따라서 i와 j가 같지 않은것 확인 안해도 된다.
//k : 0 ~ 2 => 0~ m 테스트 수
//s : 0 ~ 3 => 0~ n 등수
//k테스트에서 i의 등수와 j의 등수를 찾는다.


class Array12_S {
	static int solution(int n, int m, int[][] arr) {
		int answer = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				int cnt = 0;
				
				for (int k = 0; k < m; k++) {
					int pi = 0, pj = 0;
					//i의 등수, j의 등수
					
					for (int s = 0; s < n; s++) {
						if (arr[k][s] == i)
							pi = s;
						if (arr[k][s] == j)
							pj = s;
					}
					if (pi < pj)
						cnt++;
				}
				if (cnt == m) {
					answer++;
					//System.out.println(i+" "+j);
				}
			}
		}
		return answer;
	}

	public static void main(String[] args) {
		Scanner kb = new Scanner(System.in);
		int n = kb.nextInt();
		int m = kb.nextInt();
		int[][] arr = new int[m][n];
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				arr[i][j] = kb.nextInt();
			}
		}
		System.out.print(solution(n, m, arr));
	}
}

 

#TwoPointer

int answer=0, int cnt=0, int lt=0;
for(int rt=0; rt<n; rt++){
~
while( >m){
if() cnt--;
~
lt++;
}
}

 

3. 연속된 자연수의 합

package twopointer.ch03;

import java.util.Scanner;
//연속된 자연수의 합

public class Twopointer05_3 {
	public int solution(int n) {
		int answer=0, sum=0, lt=0;
		int [] arr = new int[n/2+1];
		for(int i=1;i<=n/2+1;i++) {
			//주어진 수를 2로 나누고 +1한 값까지만 필요하다
			arr[i-1]=i;
		}
		for(int rt=0;rt<arr.length;rt++) {
			//증가 하고 더한다.
			sum+=arr[rt];

			//sum이 결과에 도달했을때, sum이 결과보다 클때 처리
			if(sum==n) {
				answer++;
				sum-=arr[lt++];
			}
			while(sum>n) {
				sum-=arr[lt++];
				if(sum==n) {
					answer++;
					sum-=arr[lt++];
				}
			}
			
		}
		
		return answer;
	}
	public static void main(String[] args) {
		Twopointer05_3 T = new Twopointer05_3();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		System.out.println(T.solution(n));
		
		
	}

}

 

 

4. 최대 길이 연속부분수열 -> 0을 1로 K번 바꿔서 최대길이를 만들어라

package twopointer.ch03;

import java.util.Scanner;

public class Twopointer06_3 {
	public int solution(int[] arr, int k) {
		int answer=0, lt=0, cnt=0;
		
		for(int rt=0;rt<arr.length;rt++) {
			if(arr[rt]==0) {
				cnt++;
			}
			
			while(cnt>k) {
				//바꾼 횟수가 k보다 크면 계속 반복
				if(arr[rt]==0)
					cnt--;
							
				lt++;
				//rt가 0을 1로 바꾼 걸, lt가 쫓아가면서 1을 0으로 바꾼다.
			}
			answer=Math.max(answer, rt-lt+1);
			//1인 부분의 길이 = rt-lt+1
			
		}
		
		return answer;
	}
	public static void main(String[] args) {
		Twopointer06_3 T = new Twopointer06_3();
		Scanner kb = new Scanner(System.in);
		int n=kb.nextInt();
		int k=kb.nextInt();
		int [] arr = new int[n];
		for(int i=0;i<n;i++) {
			arr[i]=kb.nextInt();
		}
		System.out.println(T.solution(arr, k));
	}

}

 

728x90
반응형