seo0h
Hello seo
seo0h
전체 방문자
오늘
어제
  • 분류 전체보기 (29)
    • PJ Summary (1)
    • Study (27)
      • FE-Study (8)
      • PS (12)
      • JAVA (1)
      • Error log (1)
      • PJ log (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Programmers
  • PS STUDY
  • react
  • 프리온보딩
  • javascript
  • sideproect
  • 2022회고
  • Web
  • 코딩테스트
  • 백준
  • java
  • 취준컴퍼니
  • head tag
  • 개발자회고
  • 프로그래머스
  • til
  • 원티드 프리온보딩
  • html
  • typescript
  • FeedbackDay

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
seo0h

Hello seo

[PS]백준 CLASS1 + JAVA 풀이들 (에센셜 16문제)
Study/PS

[PS]백준 CLASS1 + JAVA 풀이들 (에센셜 16문제)

2022. 11. 7. 02:11

인생 첫 코테 준비를 하는 것을 기록해서 남기고자 이 게시판을 팠다.

좀 고민하면서 푼 것들 위주로 의식의 흐름대로 풀이가 작성되어 있으니...

만약! 이 글을 읽는 분이 계시다면 참고하시길 바랍니다.


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
    'Study/PS' 카테고리의 다른 글
    • [PS] 백준 1546번: 평균 (Java 11)
    • [PS] 백준 2577번: 숫자의 개수 (Java 11)
    • [PS] 백준 2908번: 상수 (Java 11)
    • [PS] CLASS1 : N 찍기, 별 찍기, 알람 시계
    seo0h
    seo0h
    디발자 프엔 취준생

    티스토리툴바