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 |