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
반응형
'Java > Java 알고리즘 프로그래머스' 카테고리의 다른 글
[프로그래머스 - 정렬] 02. 가장 큰 수 (0) | 2022.07.22 |
---|---|
[프로그래머스 - 그리디] 01. 기지국 설치 (0) | 2022.07.22 |
[프로그래머스-LEVEL 1] 17. 시저 암호 (0) | 2022.05.08 |
[프로그래머스-LEVEL 1] 16. 약수의 합 (0) | 2022.05.08 |
[프로그래머스-LEVEL 1] 15. 이상한 문자 만들기 (0) | 2022.05.08 |