백준

8주차_백준 문제풀이

JANNNNNN 2023. 6. 18. 20:14

목차

1. 문제 17413

2. 문제 10989

3. 문제 1110


1. 문제 17413

풀이

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String S = sc.nextLine();
		Stack<Character> stk = new Stack<>();
		
		//<> 안에 안에 있는지 밖에 있는지 구분
		//안이면 true, 밖이면 false
		boolean inout = false;
		
		//S를 하나씩 탐색
		for (int i = 0; i < S.length(); i++) {
			//'<'이게 오면 
			if (S.charAt(i) == '<') {
				inout = true; // 태그 안
				
				//스택에 저장되어 있는거를 다 pop하면서 출력
				while (!stk.isEmpty()) {
					System.out.print(stk.pop());
				}
				
				//'<'기호 표시
				System.out.print(S.charAt(i));
			}
			
			//'>' 이게 오면
			else if(S.charAt(i)=='>') {
				inout = false;
				System.out.print(S.charAt(i));
			}
			
			// <>안에 있으면
			else if(inout) {
				//순서 그대로 출력
				System.out.print(S.charAt(i));
			}
			
			// <>밖에 있으면
			else if(!inout) {
				//공백이라면
				if(S.charAt(i)==' ') {
					//스택에 저장되어 있는거를 다 pop하면서 출력
					while (!stk.isEmpty()) {
						System.out.print(stk.pop());
					}
					
					//공백 출력
					System.out.print(S.charAt(i));
				}
				
				//공백이 아니면
				else {
					//스택에 넣기
					stk.push(S.charAt(i));
				}
			}
		}
		
		//나머지 스택에 저장되어 있는거를 다 pop하면서 출력
		while (!stk.isEmpty()) {
			System.out.print(stk.pop());
		}
	}
}

기본설명

- 문자열을 거꾸로 출력하는 것은 Stack을 활용하면 된다.

- 그리고, 태그 안과 밖을 구분하는 boolean형 변수를 하나 만들어서 태그 안에 있으면 true, 밖이면 false로 둔다.

- 먼저, '<'이 오면 Stack에 저장되어 있는 것들을 먼저 다 출력한다. Stack이 빌 때까지.

- '>'이 오면 그대로 출력

- 태그 안에 있으면 문자열을 그대로 출력

- 태그 밖에 있으면서 공백이 오면 스택에 있는 것들을 빌 때까지 pop하여 출력하고, 공백이 아니면 스택에 push를 한다. 


2. 문제 10989

풀이

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class Main {

	public static void main(String[] args) throws NumberFormatException, IOException {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		int[] array = new int[N];
		
		for(int i = 0 ; i < N ; i++) {
			array[i] = Integer.parseInt(br.readLine());
		}
		
		Arrays.sort(array);
		
		for(int i = 0 ; i < N ; i++) {
			bw.write(String.valueOf(array[i]) + "\n");
		}
		
		br.close();
		bw.flush();
		bw.close();
	}
}

Arrays.sort()를 사용!


3. 문제 10989

풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
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 = 0;
		int copy = N;
        
		do {
			N = ((N % 10) * 10) + (((N / 10) + (N % 10)) % 10);
			cnt++;
		} while (copy != N);
		//copy와 N이 같을때 종료
        
		System.out.println(cnt);
	}
}

 

기본설명

먼저 N 이라는 정수가 주어진다고 가정하자.

 

그러면 N의 1의 자릿수는 새로운 수의 10의 자리로,

N의 1의 자릿수와 10의 자릿수를 더한 값의 1의 자릿수는 새로운 수의 1의 자리로 가면 된다.

(만약 N 이 한 자릿수 정수라면 앞에 0을 붙여서 더한다.)

 

즉 아래의 위와 같은 구조다.

 

먼저 주어진 수를 N 이라 하고 새로운 수를 T로 가정한다.

먼저 주어진 수 N의 일의 자릿수 새로운 수(T)의 십의 자릿수로 간다.

 10으로 나눈 나머지 값에 10을 곱하면 T의 십의 자릿수가 된다.

 

각 자리수의 합은 먼저 N의 십의 자릿수는 나누기 10 을 하면 N이 한 자릿수이면 0,

그 외에는 십의 자릿수가 그대로 반환된다.

그리고 N의 일의 자릿수는 나머지인 % 을 쓰면 된다.

 

이 두개를 더한 뒤 10으로 나눈 나머지가 N의 각 자릿수의 합의 일의 자릿수가 T의 일의 자릿수가 되겠다.

이를 합친 while문을 작성하면

위와 같은 그림이 된다.

여기서 주의해야할 점은 T를 새로운 수로 가정했는데, 실제로는 반복문에서 N 값을 계속 새로운 값으로 대체해주어야 하는 것이니 T 를 N으로 고친다.