인생 첫 코테 준비를 하는 것을 기록해서 남기고자 이 게시판을 팠다.
좀 고민하면서 푼 것들 위주로 의식의 흐름대로 풀이가 작성되어 있으니...
만약! 이 글을 읽는 분이 계시다면 참고하시길 바랍니다.
A/B
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
double A = input.charAt(0);
double B = input.charAt(2);
System.out.println(A/B);
}
}
이렇게 하면 될 거라고 생각했는데 input: 1 3 일때 A, B 출력을 해보니
A: 49.0 / B: 51.0
이렇게 각 문자의 아스키코드 값이 나왔다.
이럴때는, 각 문자열의 아스키코드 값이 나왔다.
구글링해보니 0의 아스키코드 값, 48을 빼주면 된다고 한다.
double A = input.charAt(0) - 48;
double B = input.charAt(2) - 48;
이렇게 바꾸니까 잘 나온다.
별찍기
문제: 첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍어라
입력: 첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
알게 된 사실:
자바는 문자열곱하기 안된다. 이중 for 문 써서 구현해야 한다.
println과 printf의 차이를 잘 기억하고 적재적소에 써먹을 수 있도록 하자.
println과 printf의 각각의 특징
1. System.out.println(출력내용)
String과 기본형은 저장된 값 그대로 출력된다.
변수와 문자열을 '+'로만 이어주면 같이 사용할 수 있다.
출력 후 줄바꿈된다.2. System.out.printf (”출력 서식”, 출력 내용)
출력 후 줄바꿈 하지 않음. 줄바꿈을 원한다면 ‘%n’ 넣어야함.
출력하는 값의 수만큼 지시자 사용 필요
출력될 값과 지시자의 순서는 일치해야함
지시자를 제외한 문자는 그대로 출력됨
printf 의 출력 서식
%b | boolean 형식으로 출력 |
%d | 정수 형식으로 출력 |
%o | 8진수 정수의 형식으로 출력 |
%x / %X | 16진수 정수의 형식으로 출력 |
$f | 소수점 형식으로 출력 |
%c | 문자형식으로 출력 |
%s | 문자열 형식으로 출력 |
%n | 줄바꿈 기능 |
%e / %E | 지수 표현식의 형식으로 출력 |
public class starOutput {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String star = "*";
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
System.out.printf(star);
}
System.out.printf("%n");
}
}
}
최댓값
문제: 9개의 서로 다른 자연수가 주어질 때, 이들 중 최댓값을 찾고 그 최댓값이 몇 번째 수인지를 구하는 프로그램을 작성하시오.
입력: 첫째 줄부터 아홉 번째 줄까지 한 줄에 하나의 자연수가 주어진다. 주어지는 자연수는 100 보다 작다.
생각정리
배열 max 구하는 법:
1. for문 이용 → 너무 귀찮다.
2. Array.sort(배열명) 이용 : 자동으로 크기별로 정렬 되어 마지막 숫자 빼서 쓰면 알 수 있음
→ 배열의 몇번째 수인지도 알아야 해서… 못쓴다.
3. Stream 이용 -> 이 방식으로 선택
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = new int[9];
//입력부분
for (int i=0; i<9; i++) {
arr[i] = sc.nextInt();
}
//스트림 생성
IntStream maxStream = Arrays.stream(arr);
int arrMax = maxStream.max().getAsInt();
int index = 0 ;
for (int i=0; i<arr.length; i++) {
if(arr[i] == arrMax) {
index = i+1;
}
}
System.out.println(arrMax);
System.out.println(index);
}
아직 스트림에 대해 정확히 잘 모르고 쓴 부분이 있어서, 나중에 글로 정리해볼까 한다.
문자열 반복
문제: 문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오.
입력: 첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다.
//입력값 형식
2 // T(1 ≤ T ≤ 1,000): 체스트 케이스의 개수
3 ABC // R(1 ≤ R ≤ 8): 반복횟수 / S: 문자열
5 /HTP // R과 S는 공백으로 구분된다
→ 나의 가설
// scanner 설정
// 1열: int
// T(테스트 케이스 개수,1 ≤ T ≤ 1,000)열: String , nextline
// for문으로 T(테스트 케이스 개수) 확인
// for문 안에서 t열 글자열 나누기 처리
// 1. 공백 제거
// 2. 숫자 - 글자 분리
// 3-1. 숫자는 for문의 인자로 들어가기.
// 3-2. 글자는 char 타입으로 변환, for문 안에서 인자만큼 돌린 후 변수에 따로 담기
// 3-3. for 루프 안에서 바로 출력.
막힌 지점.
array 로만 문제를 풀려고 하니.. for문이 너무 난잡해져서 생각할게 너무 많아졌다.
그냥 유연하게 크기를 조절 가능한 list로 만들어 푸는게 낫다고 판단 후 코드 수정.,,
public static void main(String[] args) {
// scanner 설정
Scanner sc = new Scanner(System.in);
// 문자열 입력부
// 1열: testCase => int
int testCase = sc.nextInt();
sc.nextLine(); //enter값 들어오는 것 보정
// testCase열: R(반복횟수) S(문자열)
String[] input = new String[testCase];
for (int i = 0; i < testCase; i++) {
input[i] = sc.nextLine();
}
// 문자열 처리부
// 나눠진 R과 S가 담기는 배열
String[] splitInput = null;
for (int i = 0; i < testCase; i++) {
// R과 S 공백을 이용해 나누기
splitInput = input[i].split(" ");
// 반복 횟수 R, 문자열 S 선언
int R = Integer.parseInt(splitInput[0]);
String S = splitInput[1];
// 문자열 -> char문자 배열로 쪼개어 R만큼 for문 돌릴 준비
char[] charS = S.toCharArray();
List<String> finalSList = new ArrayList<>(); //list로 선언하여 유연하게 크기 조절.
for(int j=0; j<charS.length; j++)
for(int k=0; k<R; k++)
finalSList.add(String.valueOf(charS[j]));
System.out.println(String.join("", finalSList));
}
}
일단 11/07 새벽 여기까지 완료~
음계
package Solvedac.Class.Class1;
import java.lang.reflect.Array;
import java.util.Scanner;
public class scale {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String scaleRaw = sc.nextLine();
String[] scaleRawSplit = scaleRaw.split(" ");
String inputScale = String.join("", scaleRawSplit);
int inputScaleint = Integer.parseInt(inputScale);
int ascending = 12345678;
int descending = 87654321;
if(inputScaleint == ascending) {
System.out.println("ascending");
} else if(inputScaleint == descending) {
System.out.println("descending");
} else {
System.out.println("mixed");
}
}
}
O/X퀴즈
문제: "OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다. OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.
//예제 입력
5
OOXXOXXOOO
OOXXOOXXOO
OXOXOXOXOXOXOX
OOOOOOOOOO
OOOOXOOOOXOOOOX
==를 이용해 문자열을 비교하면 안된다는걸 알았다.
문자열이 같지만 false 를 리턴하는 경우도 있다!
equals(), compareTo() 를 사용해 문자열을 비교하자.
package Solvedac.Class.Class1;
import java.util.Scanner;
public class Score {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// Test 케이스 개수 입력
int T = sc.nextInt();
sc.nextLine();
// 문자열 입력
String[] scoreStrRaw = new String[T];
for (int i = 0; i < T; i++) {
scoreStrRaw[i] = sc.nextLine();
}
// 1. O - X 분리 - 문자열을 다 분해 후, O가 나올때마다 점수 증가.
// 2. O 나올때마다 1-2-3 .. 순행으로 점수 증가 및 합산
// 3. 각 열의 점수 순서대로 출력
// 문자열 분해
String[] scoreStr = new String[scoreStrRaw.length];
for (int k = 0; k < scoreStrRaw.length; k++) {
scoreStr = scoreStrRaw[k].split("");
int score = 0; // 점수
int count = 0; // 연속적인 o 카운트
// 문자열 처리부
for (int j = 0; j < scoreStr.length; j++) {
if (scoreStr[j].equals("O")) {
count += 1;
score += count;}
else {count = 0;}}
System.out.println(score);
}
}
}
최소, 최대
문제: N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.
입력: 첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
public class minMax {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//정수의 개수
int N = sc.nextInt();
sc.nextLine();
//문자열로 들어오는 숫자 -> intStream 처리 -> min, max 구하기
String[] strInput =sc.nextLine().split(" ");
int[] intInput = Arrays.stream(strInput).mapToInt(Integer::parseInt).toArray();
int max = Arrays.stream(intInput).max().getAsInt();
int min = Arrays.stream(intInput).min().getAsInt();
System.out.println(min + " " + max);
}
}
stream 을 잘 이용하니 .. 유용하다! 대신 데이터가 돌때 사용되는 메모리의 양과 시간 소모가 좀 큰 것 같다.
stream 말고 다른 방법으로도 풀어보면 어떨까 한다.
일단, 여기까지가 CLASS 1 에센셜… 너무 쉬운 새싹 문제들은 더이상 풀지 않기로 했다. 비슷한 문제의 반복이라..
내 GIT TIL Rebo에도 풀때마다 커밋중이다.
뭐든 꾸준히 해보도록 하자.
GitHub - Seo0H/TIL: Today I Learned
Today I Learned. Contribute to Seo0H/TIL development by creating an account on GitHub.
github.com
'Study > PS' 카테고리의 다른 글
[PS/Java] 프로그래머스 Lv.1 : 제일 작은 수 제거하기 (1) | 2023.01.17 |
---|---|
[PS] 백준 1546번: 평균 (Java 11) (0) | 2022.11.20 |
[PS] 백준 2577번: 숫자의 개수 (Java 11) (0) | 2022.11.20 |
[PS] 백준 2908번: 상수 (Java 11) (0) | 2022.11.20 |
[PS] CLASS1 : N 찍기, 별 찍기, 알람 시계 (1) | 2022.11.09 |