본문 바로가기

코딩테스트

[JAVA] 심화 1

25083 새싹

이스케이프 문자사용하기.

제어 문자는 \n이랑 \t 정도 아니면 백준할 때는 사용한 기억이 거의 없다.

그래도 실제 프로젝트를 진행하다보면 꽤 사용하는 듯 하다. 

이번에는 결과도 출력해봤다.

이런 그림 문제 없었으면 좋겠다... 계속 틀려서 정답보고 했음


3003 킹, 퀸, 룩, 비숍, 나이, 폰

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    int str1[] = {1, 1, 2, 2, 2, 8};
    int str2[] = new int[6];

    StringTokenizer st = new StringTokenizer(br.readLine(), " ");
    
    for (int i=0;i<6;i++){
      str2[i]=Integer.parseInt(st.nextToken());
    }

    for (int i=0;i<6;i++){
      System.out.print(str1[i]-str2[i] + " ");
    }

    br.close();
  }
}

int형 배열 2개를 선언 및 초기화 한 후 비교와 동시에 출력했다.

배열 선언 및 초기화를 동시에 할 때는 위 방식 말고 int str1[] = new int[6] {1, 1, 2, 2, 2, 8}; 도 가능하다.

 


2444 별 찍기 - 7 

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    int a = Integer.parseInt(br.readLine());

    for (int i=0;i<a;i++){
      for(int j=a-i-1;j>0;j--){
        System.out.print(" ");
      }
      for(int k=i*2+1;k>0;k--){
        System.out.print("*");
      }
      System.out.println();
    }

    for (int i=a-2;i>=0;i--){
      for(int j=a-i-1;j>0;j--){
        System.out.print(" ");
      }
      for(int k=i*2+1;k>0;k--){
        System.out.print("*");
      }
      System.out.println();
    }
    
    
    br.close();
  }
}

 


10988 팰린드롬인지 확인하기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String str = br.readLine();
    int n=0;
    String str2 = new StringBuilder(str).reverse().toString();

    for(int i=0;i<str.length();i++){
      if(str.charAt(i)!=str2.charAt(i)){
        n++;
      }
    }
    if (n==0)
      System.out.println(1);
    else
      System.out.println(0);

    br.close();
  }
}

StringBuilder의 reverse() 메서드 이용

 


1157 단어 공부

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

import java.util.Scanner;


public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    char str[] = br.readLine().toUpperCase().toCharArray();
    char alp[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    int[] cnt = new int[alp.length];

    for(char ch : str){
        int idx = ch - 'A';
        cnt[idx]++;
    }

    int max = 0;
    int idx = 0;
    for(int i=0; i<cnt.length; i++){
        if(max < cnt[i]){
            max = cnt[i];
            idx = i;
        }
    }

    int maxCnt = 0;
    for (int n : cnt){
        if(max == n) {
            maxCnt++;
        }
    }

    if(maxCnt != 1){
        System.out.println("?");
    } else {
        System.out.println(alp[idx]);
    }

    br.close();
  }
}

먼저 입력받으면서 toUpperCase()를 이용해 대문자로 바꿔주었다.

또한 for-each 구문을 위해 String이 아닌 CharArray로 저장하였다.

알파벳 배열의 경우에도 문자열을 작성하고 toCharArray() 메서드를 사용하면 되는데 깜빡하고 헛수고했다...

 

이제 문자를 하나씩 비교하며 각 문자에 맞는 인덱스 자리에 넣는다.

알파벳을 -'A' 해주면 0~25까지의 알맞는 자리로 들어간다.

 

비교가 끝나면 이제 가장 많은 알파벳 개수와 중복여부를 반복문으로 판단한다.

 


2941 크로아티아 알파벳

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String str = br.readLine();
    String c[] = {"c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="};

    for (int i=0;i<c.length;i++){
      if (str.contains(c[i])){
        str = str.replace(c[i], "/");
      }
    }

    System.out.println(str.length());
    
    br.close();
  }
}

옛날에 파이썬으로 푼 기억으로 했다..

JAVA에서 문자열 포함 여부는 contains() 메서드를 이용하고, 문자열 대체는 replace() 함수를 이용한다.

 


1316 그룹 단어 체커

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int a = Integer.parseInt(br.readLine());
    int b = a;


    for (int i = 0; i < a; i++) {
      String str = br.readLine();
      String c = "abcdefghijklmnopqrstuvwxyz";
      
      for (int j=0;j<str.length();j++){
        if (c.contains(Character.toString(str.charAt(j)))) {
          c = c.replace(str.charAt(j), ' ');
        } 
        else {
          if (str.charAt(j) != str.charAt(j - 1)) {
            b--;
            break;
          }
        }
        //c = c.replace(str.charAt(j), ' ');
      }
      
    }

    System.out.println(b);

    br.close();
  }
}

알고리즘 :

반복 시작마자 문자열과 alphabet 문자열을 새로 선언한다.

만약 새로운 문자라면 alphabet 문자열에서 없애주는 것으로 문자가 왔음을 체크한다.

만약 새로운 문자가 아니라면, 이전 문자와 비교하여 다른지 체크한다. 이 때 다르다면 그룹단어 수 -1을 한 후 break

 

알고리즘 자체가 어렵다기보다는 java에서 문자와 문자열을 다루는게 어려웠다.

분명 contains() 메서드가 문자도 된다고 했던 것 같은데...문자열만 가능한 듯하다. 문자 넣으니까 오류남.

그래서 toString() 메서드를 이용하여 문자를 다시 문자열로 바꾸고 비교하는 작업을 한번 추가해주었다.


25206 너의 평점은

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;

import java.util.*;

public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    Map<String, Double> dict = new HashMap<>(){{
      put("A+", 4.5);
      put("A0", 4.0);
      put("B+", 3.5);
      put("B0", 3.0);
      put("C+", 2.5);
      put("C0", 2.0);
      put("D+", 1.5);
      put("D0", 1.0);
      put("F", 0.0);
    }};

    Double cnt=0.0; //학점
    Double num=0.0; //학점*과목평점
    
    for (int i=0;i<20;i++){
      String[] str = br.readLine().split(" ");
      if (!str[2].equals("P")){
        cnt+=Double.parseDouble(str[1]);
        num+=dict.get(str[2])*Double.parseDouble(str[1]);
      }
    }

    System.out.println(num/cnt);

    br.close();
  }
}

dictionary를 사용했다.

JAVA의 dictionary는 HashMap이다. 위와 같이 한번에 여러 데이터를 put하고 싶다면 이중 괄호를 사용한다.

Java.util을 import해야 사용 가능하고, Map<키의type, 값의 type> dict = new HashMap<>(); 로 선언 및 할당이 가능하다.

파이썬과 마찬가지로 put, get, size, remove 등의 연산자를 사용할 수 있다.

 

문자열 비교는 equals() 메서드 사용하기..!

아무 생각없이 '=='를 사용했다가 계속 오류가 나서 헤맸다..


# 회고

 

코딩하다보면 error: incompatible types: int cannot be converted to String 이런 오류를 많이 보게된다.

String형 변수에 int형 값을 넣을 수 없다는 뜻!

 

심화 문제는 혼자서 해보려고 많이 노력했다.

근데 컴파일러 사이트가 넘 느리고 불편해서 화ㄴ😡🤬🤬🤬

 

 

'코딩테스트' 카테고리의 다른 글

[JAVA] 일반 수학 1단계  (0) 2024.01.19
[JAVA] 2차원 배열  (0) 2024.01.18
[JAVA] 문자열  (0) 2024.01.16
[JAVA] 1차원 배열  (0) 2024.01.14
[JAVA] 반복문  (1) 2024.01.13