코테
[Java] 심화 1단계
상똥
2023. 11. 13. 23:32
심화 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);
}
}