본문 바로가기
코테

[Java] 심화 1단계

by 상똥 2023. 11. 13.

심화 1 단계 링크 심화 1 단계 (acmicpc.net)


 

1. 백준 25083 25083번: 새싹 (acmicpc.net)

풀이
1. 백슬래시(\), 큰따옴표(") 등을 출력할 때에는 앞에 백슬래시를 붙여줘야 한다
- " 출력 : System.out.print("\"");
- \ 출력 : System.out.print("\\");
2. 푸는 방식에 따라 문제와는 관련이 없을 수 있지만 아래 사항도 알아두면 좋다
- 줄바꿈 : \n
- 한 문자 앞으로 : \b
- 맨 앞으로 : \r
- 탭 : \t
- 빈 칸 : \0
회고
- 오랜만에 기본적인 사항들을 되짚어봐서 좋았다
풀이 (접은 글)
더보기
public class Main {
    public static void main(String[] args) {
        String str = "         ,r'\"7\n"
            +"r`-_   ,'  ,/\n"
            +" \\. \". L_r'\n"
            +"   `~\\/\n"
            +"      |\n"
            +"      |";
        System.out.print(str);
    }
}

 

2. 백준 3003 3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰 (acmicpc.net)

풀이
1. 기본이 되는 체스 말의 개수를 chess 배열에 저장한다
2. BuffferedReader br을 사용해 입력되는 체스 말의 개수를 읽어들이고, 배열 input에 저장한다.
- String s로 하나하나 읽어들이고 
- split 메소드를 사용해 input에 저장한다.
3. 반복문을 사용해 temp에 input변수를 하나씩 정수로 변환해 저장한다.
4. 반복문을 사용해 chess[i]-temp+" "를 출력해준다.
회고
- BuffferedReader를 읽어들일 때에는 무조건 String 변수이므로 변환이 필요하다
코드 (접은 글)
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String args[]) throws IOException {
        int[] chess = {1, 1, 2, 2, 2, 8};

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();
        String[] input = s.split(" ");
        
        for (int i = 0; i < 6; i++) {
            int temp = Integer.parseInt(input[i]);
            System.out.print(chess[i] - temp + " ");
        }
    }
}

 

3. 백준 2444번 2444번: 별 찍기 - 7 (acmicpc.net)

풀이
1. 이중 반복문으로 푼다
2. 줄은 총 2*N-1행으로 출력되며 가운데 행은 2*N-1개의 별이 출력된다.
- 이중 반복문을 2개 사용하여 위의 이중 반복문에서 2*N-1개의 별을 출력하도록 한다.
- for (int i = 1 ; i <= N ; i++ ) (중략) for (int i = N-1 ; i >= 1 ; i--)
3. 가운데 행 위의 i번째 행의 경우 공백은 앞에서 N-i개 출력된다.
- for (int j = 1 ; j > j <= N-i ; j++) { answer.append(" ") }
4. 가운데 행 위의 i번째 행의 경우 별은 뒤에서 2*i-1개 출력된다.
- - for (int j = 1 ; j > j <= 2*i-1 ; j++) { answer.append("*") }
5. 이중반복문이 한 번 돌 때마다 줄바꿈이 이루어저야한다.
6. 위의 사항들을 StringBuilder를 사용해 하나로 합쳐준다.
회고
- StringBuilder 기억하고 잘 활용하기
- 별찍기는 규칙성이 중요하니 잘 확인하기
풀이 (접은 글)
더보기
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        StringBuilder answer = new StringBuilder();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n-i; j++) {
                answer.append(" ");
            }
            for (int j = 1; j <= 2*i-1; j++) {
                answer.append("*");
            }
            answer.append("\n");
        }
        for (int i = n-1; i >= 1; i--) {
            for (int j = 1; j <= n-i; j++) {
                answer.append(" ");
            }
            for (int j = 1; j <= 2*i-1; j++) {
                answer.append("*");
            }
            answer.append("\n");
        }
        System.out.print(answer);
    }
}

 

4. 백준 10988번 10988번: 팰린드롬인지 확인하기 (acmicpc.net)

풀이
1. 정답이 될 변수 a에 1을 미리 저장한다.
2. for문을 사용해서 전체 문자열의 반만 확인한다.
3. 변수 length에 문자열의 길이-1을 저장한 후 for문을 돌며 1씩 줄여간다
4. 만약 대칭되는 두 문자가 다르다면 변수 answer에 0을 저장한 후 break 
회고
- 파이썬이랑 헷갈리지 말자 charAt 기억하기
코드 (접은 글)
더보기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
    public static void main(String args[]) throws IOException {
        int answer = 1;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        int length = input.length() - 1;

        for (int i = 0; i < input.length() / 2; i++) {
            if (input.charAt(i) != input.charAt(length)) {
                answer = -1;
                break;
            }
            length -= 1;
        }
        System.out.println(answer);
    }
}

 

 

5. 백준 1157 1157번: 단어 공부 (acmicpc.net) 

풀이
1. 알파벳은 26개이므로 26사이즈의 배열 arr을 준비한다.
2. System.in.read() 를 통해 알파벳을 유니코드로 읽어들인다.
- 우선 먼저 한 개를 읽어들이고 아래의 whilr문 아래에서 알파벳이 끝날때까지 읽어들인다.
3. 알파벳 유니코드가 97 이상 즉, 소문자면 -97로 배열에 저장할 수 있게 만든다.
4. 3번에 해당하지 않는 경우 -65로 배열에 저장할 수 있게 만든다.
5. System.in.read();로 다음 알파벳을 읽어들인다.
6. 변수 max는 최대로 입력받은 그 크기를 나타내고
7. 변수 ch는 알파벳 그 자체를 나타낸다. 
- ch의 초기값이 -2인 이유는 후에 65를 더해 알파벳을 대문자로 출력할 때 63이 되므로, ?가 출력되도록 하기 위함이다.
8. 값을 비교해가며 max값과 ch값을 변동시킨다.
- max값보다 큰 것이 있으면 max값에 저장 후 ch를 i로 바꾼다.
- max값과 동일한 값이 있으면 ch를 다시 -2로 바꾼다
9. (char)(ch+65)출력 
회고
- System.in.read() 잘 활용하자
코드 (접은 글)
더보기

풀이

import java.io.IOException;

public class Main {
    public static void main(String args[]) throws IOException {
        int[] arr = new int[26];
        int c= System.in.read();
        while(c>64){
            if(c>=97){
                arr[c-97]++;
            }
            else{
                arr[c-65]++;
            }
            c= System.in.read();
        }

        int max = 0;
        int ch=-2;
        for (int i = 0; i < 26; i++) {
            if(arr[i]>max){
                max=arr[i];
                ch=i;
            }
            else if (arr[i]==max) {
                ch=-2;
            }
        }
        System.out.println((char)(ch+65));
    }
}

 

6. 백준 2941번 2941번: 크로아티아 알파벳 (acmicpc.net)

풀이
1. 글자를 하나하나 따져가는 방식으로 할 수 밖에 없었다
2. 글자의 위치를 인덱스로 파악하며 이때 범위에 유의하도록 한다.
회고
- 난 항상 범위에서 실수를 하는 듯,,, 조심하자
코드(접은 글)
더보기
풀이
package com.example.codingtest;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        while (index < s.length()) {
            if (index == s.length() - 1) {
                answer++;
                break;
            }
            if ((index + 2 < s.length()) && (s.charAt(index) == 'd') && (s.charAt(index + 1) == 'z') && (s.charAt(index + 2) == '=')) {
                answer++;
                index += 3;
            } else if (((s.charAt(index) == 'l') || (s.charAt(index) == 'n')) && (s.charAt(index + 1) == 'j')) {
                answer++;
                index += 2;
            } else if ((s.charAt(index + 1) == '=') || (s.charAt(index + 1) == '-')) {
                answer++;
                index += 2;
            } else {
                answer++;
                index++;
            }
        }
        System.out.println(answer);
    }
}​

 

7. 백준 1316 1316번: 그룹 단어 체커 (acmicpc.net)

풀이
1. Buffered br을 사용해 전체 단어의 개수를 N과 cnt에 저장한다.
2. 반복문 for을 사용해 N번동안 각각의 단어를 br.readline으로 읽어들인다.
3. int arr[123]을 사용해 i번째 알파벳이 있으면 그에 대칭되는 유니코드를 1로 바꾸고 i번째 알파벳 유니코드를 prev에 저장한다
- 이때, prev는 초기값이 0이다.
- arr을 26사이즈로 하고 -97을 할까 했는데 그럼 코드 길이도 길어지고 더 느려지길래 그냥 123으로 했다. 다만 용량은 26으로 하는게 약간 더 적었다.
4. 만약 arr=1이고 charAt(i)=!prev이면 cnt에서 1을 뺀다.
5. answer를 반환한다.
회고
- boolean으로 하는것보다 int로 하는게 항상 쉽게 느껴지는 이유는 왜일까...
- boolean으로 할때보다 확실히 빠르긴 하다
코드 (접은 글)
더보기

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        int prev = 0;
        for (int i = 0; i < N; i++) {
            String s = br.readLine();
            int[] arr = new int[123];
            prev = s.charAt(0);
            arr[prev] = 1;
            for (int j = 1; j < s.length(); j++) {
                if (((int) s.charAt(j) != prev) && (arr[(int) s.charAt(j)] > 0)) {
                    cnt--;
                    break;
                }
                prev = s.charAt(j);
                arr[prev] = 1;
            }
        }
        System.out.println(cnt);
    }
}

 

8. 백준 25206번: 너의 평점은 (acmicpc.net)

풀이
1. 받은 학점을 student=0, 총 학점을 total=0으로 선언한다.
2. 반복문을 통해 각 줄을 읽으며 띄어쓰기를 기준으로 나누어준다.
- 이때 배열을 생성해서 학점은 arr[1], 성적은 arr[2]에 저장한다.
3. arr[2] = P일때는 계산하지 않고 넘어간다
4. 성적별로 총학점 total에 적정한 값을 더한다.
5. arr[1] arr[2]를 곱한 값을 학생점수 student에 더한다.
6. 나눈 값을 출럭한다.
회고
- map을 사용해할까 싶었으나 메모리와 시간에서 너무 큰 차이가 나 무난하게 if-else문으로 해결했다
코드(접은 글)
더보기

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

        for (int i = 0; i < 20; i++) {
            String line = br.readLine();
            String[] arr = line.split(" ");
            if (arr[2].equals("P"))
                continue;

            if (arr[2].equals("A+")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 4.5;
            } else if (arr[2].equals("A0")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 4.0;
            } else if (arr[2].equals("B+")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 3.5;
            } else if (arr[2].equals("B0")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 3.0;
            } else if (arr[2].equals("C+")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 2.5;
            } else if (arr[2].equals("C0")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 2.0;
            } else if (arr[2].equals("D+")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 1.5;
            } else if (arr[2].equals("D0")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 1.0;
            } else if (arr[2].equals("F")) {
                total += Double.parseDouble(arr[1]);
                stu += Double.parseDouble(arr[1]) * 0;
            }

        }

        System.out.println(stu / total);
    }
}