1. 문자찾기
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s = sc.nextLine();
char c=sc.nextLine().charAt(0);
// Main sol = new Solution();
// System.println(sol(c,s));
System.out.println(Solution(c,s));
}
public static int Solution(char c, String str){
int answer = 0;
for(int i=0;i<str.length();i++){
if(str.toLowerCase().charAt(i) == Character.toLowerCase(c)){
answer++;
}
}
return answer;
}
}
2. 대소문자 변환
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
StringBuilder sb = new StringBuilder();
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(Character.isUpperCase(c)){
sb.append(Character.toLowerCase(c));
}
else if(Character.isLowerCase(c)){
sb.append(Character.toUpperCase(c));
}
}
return sb.toString();
}
}
+) String <-> Character
Character.toString(char c): 주어진 char 값을 String으로 변환합니다.
String.valueOf(char c): 주어진 char 값을 String으로 변환합니다.
자바의 String 클래스에서 concat 메서드는 두 문자열을 연결하는 기능을 제공합니다. 이와 유사한 기능을 하는 다른 메서드들도 있습니다. 여기서는 String 클래스의 concat과 유사한 메서드들을 설명하겠습니다.
String 클래스의 concat과 유사한 메서드
+연산자:- 문자열을 결합하는 가장 일반적인 방법입니다.
- 예제:
String str1 = "Hello"; String str2 = " World"; String result = str1 + str2; System.out.println(result); // 출력: Hello World
String.format(String format, Object... args):- 포맷 문자열을 사용하여 여러 문자열과 값을 결합합니다.
- 예제:
String str1 = "Hello"; String str2 = "World"; String result = String.format("%s %s", str1, str2); System.out.println(result); // 출력: Hello World
String.join(CharSequence delimiter, CharSequence... elements):- 지정된 구분 기호로 여러 문자열을 결합합니다.
- 예제:
String str1 = "Hello"; String str2 = "World"; String result = String.join(" ", str1, str2); System.out.println(result); // 출력: Hello World
StringBuilder.append(String str):StringBuilder를 사용하여 문자열을 결합합니다. 여러 번의 문자열 추가가 필요한 경우 유용합니다.- 예제:
String str1 = "Hello"; String str2 = " World"; StringBuilder sb = new StringBuilder(); sb.append(str1); sb.append(str2); String result = sb.toString(); System.out.println(result); // 출력: Hello World
StringBuffer.append(String str):StringBuffer를 사용하여 문자열을 결합합니다.StringBuilder와 유사하지만 스레드 안전합니다.- 예제:
String str1 = "Hello"; String str2 = " World"; StringBuffer sb = new StringBuffer(); sb.append(str1); sb.append(str2); String result = sb.toString(); System.out.println(result); // 출력: Hello World
concat과 유사한 메서드들
+ 연산자와 concat() 메서드의 비교
+연산자: 더 직관적이고 간단하지만, 성능 측면에서 문자열을 많이 연결할 때는 비효율적일 수 있습니다.concat()메서드: 두 문자열을 결합할 때 사용되며, 새로운 문자열을 반환합니다.null값을 다루지 않으므로 주의가 필요합니다.
예제: concat() 메서드와 + 연산자
public class Main {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = " World";
// concat() 메서드 사용
String result1 = str1.concat(str2);
System.out.println(result1); // 출력: Hello World
// + 연산자 사용
String result2 = str1 + str2;
System.out.println(result2); // 출력: Hello World
}
}
요약
String클래스에는 문자열을 결합하는 다양한 방법이 있습니다.+연산자와concat()메서드는 간단한 문자열 결합에 적합합니다.StringBuilder와StringBuffer는 성능과 스레드 안전성을 고려하여 문자열을 결합하는 데 사용됩니다.String.format()과String.join()은 포맷팅과 구분 기호를 사용한 결합에 유용합니다.
이 메서드들을 사용하여 문자열을 효과적으로 결합할 수 있습니다. 상황에 맞는 메서드를 선택하여 사용하면 됩니다.
3. 문장 속 단어
(1) 초기값 세팅
(2) split 사용법
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str= in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
String [] strArr = str.split(" ");
int cnt=strArr[0].length();
String answer=strArr[0];
for(int i=1;i<strArr.length;i++){
if(cnt<strArr[i].length()){
cnt=strArr[i].length();
answer=strArr[i];
}
}
return answer;
}
}
String 클래스의 split() 메서드는 주어진 구분자를 기준으로 문자열을 분할하여 문자열 배열로 반환합니다. 이를 통해 문자열을 쉽게 파싱하거나 분할할 수 있습니다. 여기에는 split() 메서드의 다양한 활용 예시가 있습니다:
- 기본 사용법: 주어진 구분자로 문자열을 분할합니다.
String str = "apple,banana,grape"; String[] fruits = str.split(","); // fruits 배열: ["apple", "banana", "grape"]- 정규 표현식 사용: 정규 표현식을 구분자로 사용하여 문자열을 분할합니다.
String str = "apple banana grape"; String[] fruits = str.split("\\s+"); // fruits 배열: ["apple", "banana", "grape"]- 제한된 분할: 구분자를 기준으로 최대 개수만큼 문자열을 분할합니다.
String str = "apple,banana,grape,melon"; String[] fruits = str.split(",", 2); // fruits 배열: ["apple", "banana,grape,melon"]- 빈 문자열로 분할: 빈 문자열을 구분자로 사용하여 문자열을 분할합니다.
String str = "applebanana"; String[] fruits = str.split(""); // fruits 배열: ["a", "p", "p", "l", "e", "b", "a", "n", "a", "n", "a"]- 특수 문자로 분할: 특수 문자를 구분자로 사용하여 문자열을 분할합니다.
String str = "apple|banana#grape"; String[] fruits = str.split("[|#]"); // fruits 배열: ["apple", "banana", "grape"]- 주의할 점 - 정규 표현식 메타 문자 사용: 정규 표현식의 메타 문자를 사용할 때는 이스케이프 처리를 해야 합니다.
String str = "apple?banana#grape"; String[] fruits = str.split("[?#]"); // fruits 배열: ["apple", "banana", "grape"]- 공백으로 분할: 공백을 구분자로 사용하여 문자열을 분할합니다.
String str = "apple banana grape"; String[] fruits = str.split(" "); // fruits 배열: ["apple", "banana", "grape"]- 문자로 분할: 각 문자를 구분자로 사용하여 문자열을 분할합니다.
String str = "abc"; String[] letters = str.split(""); // letters 배열: ["a", "b", "c"]- 파일 경로에서 파일명 추출: 파일 경로에서 파일명을 추출합니다.
String filePath = "/home/user/example.txt"; String[] parts = filePath.split("/"); String fileName = parts[parts.length - 1]; // fileName: "example.txt"- URL에서 도메인 추출: URL에서 도메인을 추출합니다.
String url = "https://www.example.com/path/to/page"; String domain = url.split("://")[1].split("/")[0]; // domain: "www.example.com"
이러한 방법들을 활용하여 split() 메서드를 유연하게 사용할 수 있습니다.
4.단어 뒤집기
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt = in.nextInt();
in.nextLine();
String [] strArr= new String[cnt];
for(int i=0;i<cnt;i++){
strArr[i]=in.nextLine();
}
Solution(cnt, strArr);
}
public static void Solution(int cnt, String[] strArr){
for(int i=0;i<strArr.length;i++){
StringBuilder sb =new StringBuilder();
sb.append(strArr[i]);
System.out.println(sb.reverse().toString());
}
}
}
네, nextInt()로 입력받은 후에 nextLine()을 사용하여 개행 문자를 처리하는 것이 일반적인 방법이지만, nextInt()를 사용한 후에 nextLine()을 사용하여도 상관없습니다.
nextLine() 메서드는 한 줄의 문자열을 읽고 개행 문자까지 포함하여 반환하기 때문에, nextInt()로 입력받은 후에 nextLine()을 호출하면 개행 문자를 소비하여 버퍼를 비워주게 됩니다. 따라서 다음 입력부터는 정상적으로 처리됩니다.
아래는 nextInt()와 nextLine()을 번갈아가면서 사용한 예시입니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 정수 입력 받기
int num = in.nextInt();
System.out.println("입력받은 정수: " + num);
// 개행 문자 처리
in.nextLine();
// 문자열 입력 받기
System.out.print("문자열 입력: ");
String str = in.nextLine();
System.out.println("입력받은 문자열: " + str);
in.close();
}
}
위 코드에서 nextInt()를 사용하여 정수를 입력받은 후에 nextLine()을 호출하여 문자열을 입력받고 있습니다. 이렇게 해도 올바르게 동작합니다.
네, 숫자를 nextLine() 메서드로 받아도 동일한 결과를 얻을 수 있습니다. 하지만 이 경우에는 추가적인 형변환 과정이 필요합니다.
nextLine() 메서드로 입력받은 값은 항상 문자열로 처리됩니다. 따라서 숫자를 nextLine()으로 받으면 그 결과도 문자열 형태로 저장됩니다. 이후에 숫자로 사용하기 위해서는 문자열을 숫자로 변환해주어야 합니다.
예를 들어, 정수를 nextLine()으로 입력받은 후에는 Integer.parseInt() 메서드를 사용하여 문자열을 정수로 변환할 수 있습니다.
아래는 nextLine()을 사용하여 숫자를 입력받고, 이를 정수로 변환하는 예시입니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 숫자를 문자열로 입력 받기
System.out.print("숫자 입력: ");
String input = in.nextLine();
// 문자열을 정수로 변환
int number = Integer.parseInt(input);
System.out.println("입력받은 숫자: " + number);
in.close();
}
}
따라서 nextInt()와 nextLine() 모두 사용 가능하지만, 입력 형태에 따라서 적절한 메서드를 선택하여 사용하는 것이 좋습니다.
5. 특정 문자 뒤집기
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str= in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
StringBuilder sb= new StringBuilder();
StringBuilder answer= new StringBuilder(str);
for(int i=str.length()-1;i>=0;i--){
char c=str.charAt(i);
if(Character.isLetter(c)){
sb.append(c);
}
}
int cnt=0;
for(int i=0;i<answer.length();i++){
char c=answer.charAt(i);
if(Character.isLetter(c) && cnt<=i){
answer.setCharAt(i, sb.charAt(cnt++));
}
}
return answer.toString();
}
}
+) StringBuilder 로 뒤집기
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str= in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
StringBuilder sb= new StringBuilder(str);
StringBuilder answer= new StringBuilder(str);
str=sb.reverse().toString();
sb= new StringBuilder();
for(int i=0;i<str.length();i++){
char c=str.charAt(i);
if(Character.isLetter(c)){
sb.append(c);
}
}
int cnt=0;
for(int i=0;i<answer.length();i++){
char c=answer.charAt(i);
if(Character.isLetter(c) && cnt<=i){
answer.setCharAt(i, sb.charAt(cnt++));
}
}
return answer.toString();
}
}
6. 중복문자제거
(1) Set
(2) HashSet - 해시셋
(3) LinkedHashSet - 순서유지 해시셋
(4) TreeSet - 정렬할수있는 셋
import java.util.Scanner;
import java.util.TreeSet;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
Set<Character> hashSet= new LinkedHashSet<>();
for(int i=0;i<str.length();i++){
hashSet.add(str.charAt(i));
}
StringBuilder sb = new StringBuilder();
for(char c : hashSet){
sb.append(c);
}
return sb.toString();
}
}
+) String 클래스의 static메서드 - valueOf(c) : char -> String으로 변환
StringBuilder 클래스의 indexOf 메서드 - String이 존재하는 위치를 반환
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
char[] charArr= str.toCharArray();
StringBuilder sb = new StringBuilder();
for(char c : charArr){
if(sb.indexOf(String.valueOf(c)) == -1){
sb.append(c);
}
}
return sb.toString();
}
}
7. 회문 문자열
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
str=str.toLowerCase();
System.out.println(Solution(str));
}
public static String Solution(String str){
StringBuilder sb1 = new StringBuilder(str);
StringBuilder sb2 = new StringBuilder(str);
sb2=sb2.reverse();
String str1=sb1.toString();
String str2=sb2.toString();
String answer="YES";
if(str1.equals(str2)){
return answer;
}else{
return "NO";
}
}
}
8. 유효한 팰린드롬
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
str=str.toLowerCase();
System.out.println(Solution(str));
}
public static String Solution(String str){
char c=' ';
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
for(int i=0;i<str.length();i++){
c=str.charAt(i);
if(Character.isLetter(c)){
sb1.append(c);
sb2.append(c);
}
}
String str1= sb1.toString();
if(str1.equals(sb2.reverse().toString())){
return "YES";
}
else{
return "NO";
}
}
}
9. 숫자만 추출
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static int Solution(String str){
char c= ' ';
String answer="";
for(int i=0;i<str.length();i++){
c=str.charAt(i);
if(Character.isDigit(c)){
answer+=c;
}
}
return Integer.parseInt(answer);
}
}
10. 가장 짧은 문자거리
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.next();
char c = in.next().charAt(0);
Solution(str, c);
}
public static void Solution(String str, char c){
int [] intArr = new int[str.length()];
int cnt = 1000;
for(int i=0;i<intArr.length;i++){
if(str.charAt(i)==c){
cnt=0;
intArr[i]=0;
}else{
cnt++;
intArr[i]=cnt;
}
}
cnt=1000;
for(int i=intArr.length-1;i>=0;i--){
if(str.charAt(i)==c){
cnt=0;
intArr[i]=0;
}else{
cnt++;
intArr[i]=Math.min(cnt,intArr[i]);
}
}
for(int i=0;i<intArr.length;i++){
System.out.print(intArr[i]+" ");
}
}
}
11. 문자열 압축
바로출력
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
Solution(str);
}
public static void Solution(String str){
//초깃값 세팅
char[] charArr = str.toCharArray();
char c = charArr[0];
char c2=' ';
int cnt=1;
System.out.print(c);
//루프
for(int i=1;i<str.length();i++){
c2=charArr[i];
if(c!=c2){
if(cnt!=1){
System.out.print(cnt);
}
System.out.print(c2);
cnt=1;
}else if(c==c2){
cnt++;
}
c=charArr[i];
}
if(cnt!=1){
System.out.print(cnt);
}
}
}
문자열로 만들기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
//초깃값 세팅
StringBuilder sb = new StringBuilder();
char[] charArr = str.toCharArray();
char c = charArr[0];
char c2=' ';
int cnt=1;
sb.append(c);
//루프
for(int i=1;i<str.length();i++){
c2=charArr[i];
if(c!=c2){
if(cnt!=1){
sb.append(cnt);
}
sb.append(c2);
cnt=1;
}else if(c==c2){
cnt++;
}
c=charArr[i];
}
if(cnt!=1){
sb.append(cnt);
}
return sb.toString();
}
}
for-while문
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String str = in.nextLine();
System.out.println(Solution(str));
}
public static String Solution(String str){
//초깃값 세팅
StringBuilder sb = new StringBuilder();
int length = str.length();
//루프
for(int i=0;i<length;i++){
int cnt =1;
//비교할 대상이 문자열의 끝보다 작고, 같으면 계속 반복
while(i+1<length && str.charAt(i)==str.charAt(i+1)){
i++;
cnt++;
}
sb.append(str.charAt(i));
if(cnt !=1){
sb.append(cnt);
}
}
return sb.toString();
}
}
12. 암호
유니코드 <-> 숫자
(char)
Character.getNumericValue()
String +=
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int result = in.nextInt();
in.nextLine();
String str= in.nextLine();
System.out.println(Solution(result,str));
}
public static String Solution(int result, String str){
str=str.replace("#","1").replace("*","0");
String answer="";
for(int i=0;i<str.length()/7;i++){
answer+=(char)Integer.parseInt(str.substring(i*7, (i+1)*7),2);
}
return answer;
}
}
StringBuilder
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int result = in.nextInt();
in.nextLine();
String str= in.nextLine();
System.out.print(Solution(result,str));
}
public static String Solution(int result, String str){
str=str.replace("#","1").replace("*","0");
StringBuilder sb = new StringBuilder();
for(int i=0;i<result;i++){
sb=sb.append((char)Integer.parseInt(str.substring(i*7, (i+1)*7),2));
}
return sb.toString();
}
}
char[] -> String
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int result = in.nextInt();
in.nextLine();
String str= in.nextLine();
System.out.println(Solution(result,str));
}
public static String Solution(int result, String str){
str=str.replace("#","1").replace("*","0");
char[] arr = new char[result];
for(int i=0;i<result;i++){
arr[i]=(char)Integer.parseInt(str.substring(i*7, (i+1)*7),2);
}
return String.valueOf(arr);
}
}
+트리맵과 배열의 복사
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cnt = in.nextInt();
Integer[] arr = new Integer[cnt];
for (int i = 0; i < cnt; i++) {
arr[i] = in.nextInt();
}
// 배열을 복사하여 정렬에 사용
Integer[] sortedArr = Arrays.copyOf(arr, cnt);
Arrays.sort(sortedArr, Collections.reverseOrder());
// TreeMap을 사용하여 각 숫자의 위치를 기록
Map<Integer, Integer> rankMap = new HashMap<>();
for (int i = 0; i < cnt; i++) {
rankMap.put(sortedArr[i], i + 1);
}
// 원래 배열의 순서대로 랭킹을 출력
for (int i = 0; i < cnt; i++) {
System.out.print(rankMap.get(arr[i]) + " ");
}
}
}
+해시맵 정렬
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cnt = in.nextInt();
int[] arr = new int[cnt];
for (int i = 0; i < cnt; i++) {
arr[i] = in.nextInt();
}
// 배열을 복사해서 정렬
int[] sortedArr = arr.clone();
Arrays.sort(sortedArr);
// 정렬된 배열의 순위를 매핑하기 위해 해시 맵 사용
Map<Integer, Integer> rankMap = new HashMap<>();
for (int i = 0; i < cnt; i++) {
rankMap.put(sortedArr[i], cnt - i);
}
// 원래 배열의 순서대로 순위 출력
for (int i = 0; i < cnt; i++) {
System.out.print(rankMap.get(arr[i]) + " ");
}
}
}
10.봉우리
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt= in.nextInt();
int [][] arr= new int[cnt][cnt];
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
arr[i][j]=in.nextInt();
}
}
System.out.println(Solution(cnt,arr));
}
public static int Solution(int cnt, int[][]arr){
int[][] comp= {{0,1},{1,0},{-1,0},{0,-1}};
int answer=0;
for(int i=0;i<cnt;i++){
A: for(int j=0;j<cnt;j++){
for(int k=0;k<4;k++){
int nx=i+comp[k][0];
int ny=j+comp[k][1];
if(nx>=0 && ny>=0 && nx<cnt && ny<cnt){
if(arr[i][j]<=arr[nx][ny]){
continue A;
}
}
}
answer++;
}
}
return answer;
}
}
+) Validation 함수 분리
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt = in.nextInt();
int[][] arr = new int[cnt][cnt];
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
arr[i][j]=in.nextInt();
}
}
System.out.println(Solution(cnt, arr));
}
public static int Solution(int cnt, int[][] arr){
int answer=0;
int [][] check = {{0,1}, {1,0}, {-1,0}, {0,-1}};
int nx=0;
int ny=0;
for(int i=0;i<cnt;i++){
A: for(int j=0;j<cnt;j++){
for(int n=0;n<4;n++){
nx=i+check[n][0];
ny=j+check[n][1];
if(Validation(nx,ny,cnt)){
if(arr[i][j]<=arr[nx][ny])
continue A;
}
}
answer++;
}
}
return answer;
}
public static boolean Validation(int x, int y, int cnt){
if(x<0 || y<0 || x>=cnt || y>=cnt){
return false;
}else
return true;
}
}
11. 임시반장 정하기
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt = in.nextInt();
int[][] arr =new int[cnt+1][6];
for(int i=1;i<=cnt;i++){
for(int j=1;j<=5;j++){
arr[i][j]=in.nextInt();
}
}
System.out.println(Solution(cnt, arr));
}
public static int Solution(int cnt, int[][]arr){
int answer=0;
int result=1;
int tmp=0;
for(int i=1;i<=cnt;i++){
boolean[] check = new boolean[cnt+1];
tmp=0;
for(int j=1;j<=5;j++){
for(int k=1;k<=cnt;k++){
if(!check[k] && arr[i][j] == arr[k][j]){
check[k]=true;
tmp++;
}
}
if(answer<tmp){
answer=tmp;
result=i;
}
}
}
return result;
}
}
+) 추가적인 배열없는 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[][] arr = new int[n+1][5];
for(int i=1;i<=n;i++){
for(int j=0;j<5;j++){
arr[i][j]=in.nextInt();
}
}
int answer=0;
int max=0;
//같은 반이었던 친구가 가장 많은 학생
for(int i=1;i<=n;i++){
int cnt=0;
for(int k=1; k<=n;k++){
for(int j=0;j<5;j++){
if(arr[i][j]==arr[k][j]){
cnt++;
break;
}
}
if(cnt>max){
max=cnt;
answer=i;
}
}
}
System.out.println(answer);
}
}
12. 멘토링
(1) 리스트 두개 사용
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt = in.nextInt();
int test = in.nextInt();
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
for(int i=0;i<test;i++){
ArrayList<Integer> listM = new ArrayList<>();
for(int j=0;j<cnt;j++){
listM.add(in.nextInt());
}
list.add(listM);
}
System.out.println(Solution(cnt,test, list));
}
public static int Solution(int cnt, int test, ArrayList<ArrayList<Integer>> list){
int answer=0;
for(int i=0;i<cnt;i++){
A:for(int k=0;k<cnt;k++){
for(int j=0;j<test;j++){
if(list.get(j).indexOf(i+1)>=list.get(j).indexOf(k+1)){
continue A;
}
}
answer++;
}
}
return answer;
}
}
(2) 배열하나만 사용 --
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[][] arr = new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
arr[i][j]=in.nextInt();
}
}
System.out.println(solution(arr, m,n));
return ;
}
public static int solution(int[][] arr, int m, int n){
int answer=0;
int[][]result = new int[arr[0].length][arr[0].length];
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
for(int k=0;k<m;k++){
result[arr[k][i]-1][arr[k][j]-1]+=1;
}
}
}
for(int i=0;i<result.length;i++){
for(int j=0;j<result.length;j++){
if(result[i][j]==m) answer++;
}
}
return answer;
}
}
1. 두 배열 합치기
(1) 리스트
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt1 = in.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<cnt1;i++){
list.add(in.nextInt());
}
int cnt2 = in.nextInt();
for(int i=0;i<cnt2;i++){
list.add(in.nextInt());
}
Collections.sort(list);
for(int a:list){
System.out.print(a+" ");
}
}
}
(2) 배열
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt1 = in.nextInt();
int[] arr1 = new int[cnt1];
for(int i=0;i<cnt1;i++){
arr1[i]=in.nextInt();
}
int cnt2 = in.nextInt();
int[] arr2 = new int[cnt2];
for(int i=0;i<cnt2;i++){
arr2[i]=in.nextInt();
}
for(int c: Solution(cnt1,cnt2,arr1,arr2)){
System.out.print(c+" ");
}
}
public static int[] Solution(int cnt1, int cnt2, int[]arr1, int[]arr2){
int[] answer=new int[cnt1+cnt2];
int lt=0;
int rt=0;
for(int i=0;i<answer.length;i++){
if(lt<arr1.length || rt<arr2.length){
if(lt<arr1.length &&arr1[lt]<=arr2[rt]){
answer[i]=arr1[lt++];
}else if (rt<arr2.length){
answer[i]=arr2[rt++];
}
}
}
return answer;
}
}
2. 공통원소 구하기
(1) 트리셋
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cnt1 = in.nextInt();
TreeSet<Integer> set1 = new TreeSet<>();
for (int i = 0; i < cnt1; i++) {
set1.add(in.nextInt());
}
int cnt2 = in.nextInt();
TreeSet<Integer> set2 = new TreeSet<>();
for (int i = 0; i < cnt2; i++) {
set2.add(in.nextInt());
}
set1.retainAll(set2);
for (int num : set1) {
System.out.print(num + " ");
}
}
}
(2) 트리맵
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int cnt1 = in.nextInt();
TreeMap<Integer, Integer> map = new TreeMap<>();
for(int i=0;i<cnt1;i++){
int c = in.nextInt();
map.put(c,map.getOrDefault(c,0)+1);
}
int cnt2 = in.nextInt();
for(int i=0;i<cnt2;i++){
int c = in.nextInt();
map.put(c,map.getOrDefault(c,0)+1);
}
for(Map.Entry<Integer, Integer> entry : map.entrySet()){
if(entry.getValue()>1) System.out.print(entry.getKey()+" ");
}
}
}
(3) 배열
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int N = in.nextInt();
int [] arrN = new int[N];
for(int i = 0; i < N; i++){
arrN[i]=in.nextInt();
}
int M = in.nextInt();
int[] arrM =new int[M];
for(int j = 0; j < M; j++){
arrM[j]=in.nextInt();
}
Main main = new Main();
Arrays.sort(arrN);
Arrays.sort(arrM);
for(int x : main.solution(arrN,arrM)){
System.out.print(x+" ");
}
}
public ArrayList<Integer> solution(int[] arrN, int[] arrM){
int lt = 0;
int rt = 0;
ArrayList<Integer> list = new ArrayList<>();
while(lt!=arrN.length && rt!=arrM.length){
if(arrN[lt]==arrM[rt]){
list.add(arrN[lt++]);
rt++;
}else if(arrN[lt]<arrM[rt]){
lt++;
}else{
rt++;
}
}
return list;
}
}
3. 최대매출
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int day = in.nextInt();
int cnt = in.nextInt();
int[] arr = new int[day];
for(int i=0;i<day;i++){
arr[i]=in.nextInt();
}
System.out.println(Solution(day, cnt,arr));
}
public static int Solution(int day, int cnt,int[] arr){
int answer=Integer.MIN_VALUE;
int tmp=0;
int lt=0;
for(int i=0;i<cnt;i++){
tmp+=arr[i];
}
answer=Math.max(answer,tmp);
for(int i=cnt;i<day;i++){
tmp-=arr[lt++];
tmp+=arr[i];
answer=Math.max(answer,tmp);
}
return answer;
}
}
+) 개선
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int day = in.nextInt();
int cnt = in.nextInt();
int[] arr = new int[day];
for(int i = 0; i < day; i++){
arr[i] = in.nextInt();
}
System.out.println(Solution(day, cnt, arr));
}
public static int Solution(int day, int cnt, int[] arr){
int answer = Integer.MIN_VALUE;
int tmp = 0;
// Initial sum of the first 'cnt' days
for(int i = 0; i < cnt; i++){
tmp += arr[i];
}
answer = tmp;
// Sliding window
for(int i = cnt; i < day; i++){
tmp += arr[i] - arr[i - cnt];
answer = Math.max(answer, tmp);
}
return answer;
}
}
+) 정석
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int N = in.nextInt();
int K = in.nextInt();
int[] sales = new int[N];
for(int i = 0; i < N; i++){
sales[i] = in.nextInt();
}
Main main = new Main();
System.out.println(main.solution(sales, K));
return ;
}
public int solution(int[] arr, int K){
//K일동안의 매출
int result=0;
int answer=0;
for(int i=0;i<K; i++){
result+=arr[i];
}
answer=result;
int p1=0;
for(;K<arr.length;K++){
result-=arr[p1++];
result+=arr[K];
answer=Math.max(result,answer);
}
return answer;
}
}
4. 연속 부분수열
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int [] arr =new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
System.out.println(Solution(n,m,arr));
}
public static int Solution(int n, int m, int[]arr){
int answer=0;
int tmp=0;
int lt=0;
for(int i=0;i<n;i++){
tmp+=arr[i];
if(tmp==m){
answer++;
}
while(tmp>m){
tmp-=arr[lt++];
if(tmp==m){
answer++;
}
}
}
return answer;
}
}
+)
import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int[]arr =new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
Main main = new Main();
System.out.println(main.solution(arr, m));
}
public int solution(int[] arr, int m){
//m보다 작으면 더하고, 같으면 추가하고, 크면 맨앞 뺀다.
int p=0;
int result=0;
int answer=0;
for(int i=0;i<arr.length;i++){
result+=arr[i];
if(result==m) answer++;
while(result>m){
result-=arr[p++];
if(result==m) answer++;
}
}
return answer;
}
}
5. 연속된 자연수의 합
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int result = in.nextInt();
System.out.println(Solution(result));
}
public static int Solution(int m){
int answer=0;
int tmp=0;
int lt=1;
for(int i=1;i<m;i++){
tmp+=i;
if(tmp==m){
answer++;
}
while(tmp>m){
tmp-=lt++;
if(tmp==m){
answer++;
}
}
}
return answer;
}
}
+)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int N = in.nextInt();
Main main = new Main();
System.out.println(main.solution(N));
return ;
}
public int solution(int N){
int sum = 0;
int start = 1;
int count =0;
for(int i = 1; i < N; i++){
sum += i;
if(sum==N)count++;
while(sum>N){
sum -= start;
if(sum==N) count++;
start++;
}
}
return count;
}
}
6. 최대 길이 연속 부분수열
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int len = in.nextInt();
int cnt = in.nextInt();
int[] arr =new int[len];
for(int i=0;i<len;i++){
arr[i]=in.nextInt();
}
System.out.println(Solution(len, cnt, arr));
}
public static int Solution(int len, int cnt, int[] arr){
int answer=Integer.MIN_VALUE;
int lt=0;
int rt=0;
while(lt<len){
while(rt<len&&arr[rt]!=0){
rt++;
}
if(rt<len&&cnt>0 && arr[rt]==0){
rt++;
cnt--;
}
answer=Math.max(answer,rt-lt+1);
if(arr[lt]==0) cnt++;
lt++;
}
return answer;
}
}
2)
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
int[] arr = new int[N];
for(int i = 0; i < N; i++){
arr[i] = in.nextInt();
}
Main main = new Main();
System.out.println(main.solution(arr, M));
return ;
}
public int solution(int[] arr, int M){
int count = 0;
int count0 = 0;
int start = 0;
int max = 0;
for(int i = 0; i < arr.length; i++){
if(arr[i] == 1){
count++;
}else if(arr[i] == 0 && count0 < M) {
count0++;
count++;
}else if(arr[i] == 0 && count0 == M){
while(arr[start] != 0){
start++;
count--;
}
start++;
}
max = Math.max(count, max);
}
return max;
}
}
+)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
int[] arr = new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
int answer=0;
int result=Integer.MIN_VALUE;
//k번 0->1로 변경가능
int lt=0;
int tmp=0;
for(int rt=0;rt<n;rt++){
if(arr[rt]==0) k--;
while(k<0){
if(arr[lt]==0) k++;
lt++;
}
result=Math.max(rt-lt+1,result);
}
System.out.println(result);
}
}
+)
import java.util.Scanner;
public class Main {
//# 최대 길이 연속 부분수열
//0과 1로 구성된 길이가 N인 수열에서, 최대 k번 변경가능한데, 0을 1로 변경가능
//최대 k번의 변경을 통해 1로만 구성된 최대 길이의 연속부분수열을 찾아라.
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n=kb.nextInt();
int m=kb.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++) {
arr[i]=kb.nextInt();
}
System.out.println(T.solution(n,m,arr));
kb.close();
}
public int solution(int n,int m,int[]arr) {
//1.ds
int answer=0, cnt=0, lt=0;
//결과값, 카운트, 포인터 변수 정의
//2.for, while
for(int rt=0;rt<n;rt++) {
//포인터2는 n까지 반복하는데,
if(arr[rt]==0)
cnt++;
//포인터2의 값이 0일경우 카운트를 증가시킨다.
while(cnt>m) {
//변경가능한수 m보다 카운트가 크면 반복
if(arr[lt]==0)
cnt--;
//포인터1의 값이 0이면 카운트에서 뺸다.
lt++;
//포인터1의 값을 증가시킨다.
}
answer=Math.max(answer, rt-lt+1);
//포인터2에서 포인터1을 빼고 +1한 값과 결과값을 비교해서 큰 값이 큰값
//결과값은 0이고, rt-lt+1은, 포인터2의 값이 0인곳이 존재하면 cnt를 증가시키므로, 변경가능하다면, 포인터1의 값이 0이면 바꾸고, 카운트를 감소시킨다.
}
return answer;
}
}'Java > Java 알고리즘 인프런' 카테고리의 다른 글
| 자바 알고리즘 복습 (2) (0) | 2024.06.12 |
|---|---|
| 5. 퍼즐게임 (+ 2차원 DP) (0) | 2022.11.10 |
| 4. 사과 먹기 (+BFS) (0) | 2022.11.10 |
| 3. 그래프 최대점수 (+DFS) (0) | 2022.11.10 |
| 2. 카드 점수 (+슬라이딩 윈도우) (0) | 2022.11.10 |