본문 바로가기

Java/Java 알고리즘 인프런

자바 알고리즘 입문 복습 (1)

반응형

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과 유사한 메서드

  1. + 연산자:
    • 문자열을 결합하는 가장 일반적인 방법입니다.
    • 예제:
    • String str1 = "Hello"; String str2 = " World"; String result = str1 + str2; System.out.println(result); // 출력: Hello World
  2. 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
  3. String.join(CharSequence delimiter, CharSequence... elements):
    • 지정된 구분 기호로 여러 문자열을 결합합니다.
    • 예제:
    • String str1 = "Hello"; String str2 = "World"; String result = String.join(" ", str1, str2); System.out.println(result); // 출력: Hello World
  4. 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
  5. 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() 메서드는 간단한 문자열 결합에 적합합니다.
  • StringBuilderStringBuffer는 성능과 스레드 안전성을 고려하여 문자열을 결합하는 데 사용됩니다.
  • 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() 메서드의 다양한 활용 예시가 있습니다:

  1. 기본 사용법: 주어진 구분자로 문자열을 분할합니다.
  2. String str = "apple,banana,grape"; String[] fruits = str.split(","); // fruits 배열: ["apple", "banana", "grape"]
  3. 정규 표현식 사용: 정규 표현식을 구분자로 사용하여 문자열을 분할합니다.
  4. String str = "apple banana grape"; String[] fruits = str.split("\\s+"); // fruits 배열: ["apple", "banana", "grape"]
  5. 제한된 분할: 구분자를 기준으로 최대 개수만큼 문자열을 분할합니다.
  6. String str = "apple,banana,grape,melon"; String[] fruits = str.split(",", 2); // fruits 배열: ["apple", "banana,grape,melon"]
  7. 빈 문자열로 분할: 빈 문자열을 구분자로 사용하여 문자열을 분할합니다.
  8. String str = "applebanana"; String[] fruits = str.split(""); // fruits 배열: ["a", "p", "p", "l", "e", "b", "a", "n", "a", "n", "a"]
  9. 특수 문자로 분할: 특수 문자를 구분자로 사용하여 문자열을 분할합니다.
  10. String str = "apple|banana#grape"; String[] fruits = str.split("[|#]"); // fruits 배열: ["apple", "banana", "grape"]
  11. 주의할 점 - 정규 표현식 메타 문자 사용: 정규 표현식의 메타 문자를 사용할 때는 이스케이프 처리를 해야 합니다.
  12. String str = "apple?banana#grape"; String[] fruits = str.split("[?#]"); // fruits 배열: ["apple", "banana", "grape"]
  13. 공백으로 분할: 공백을 구분자로 사용하여 문자열을 분할합니다.
  14. String str = "apple banana grape"; String[] fruits = str.split(" "); // fruits 배열: ["apple", "banana", "grape"]
  15. 문자로 분할: 각 문자를 구분자로 사용하여 문자열을 분할합니다.
  16. String str = "abc"; String[] letters = str.split(""); // letters 배열: ["a", "b", "c"]
  17. 파일 경로에서 파일명 추출: 파일 경로에서 파일명을 추출합니다.
  18. String filePath = "/home/user/example.txt"; String[] parts = filePath.split("/"); String fileName = parts[parts.length - 1]; // fileName: "example.txt"
  19. URL에서 도메인 추출: URL에서 도메인을 추출합니다.
  20. 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