백준 8958번 자바
https://www.acmicpc.net/problem/8958
문제내용은 아래 더보기를 누르면 나온다.
알고리즘
첫째 줄에 테스트 케이스의 개수 N이 주어진다.
그 후로 N개만큼 "OXOOOOXXO" 가 한줄씩 주어진다.
O는 문제를 맞은것, X는 문제를 틀린것이다.
연속으로 문제를 맞추면 점수가 연속된 O의 개수이다.
e.g. OOO = 1 + 2 + 3 = 6점
OOX = 1 + 2 + 0 = 3점
OXO = 1 + 0 + 1 = 2점
XXO = 0 + 0 + 1 = 1점
1. 테스트 케이스의 개수 N을 입력받는다.
2. N번만큼 반복한다.
2-1. 반복을 시작할 때 점수를 더할 sum과 문제의 점수 score를 0으로 초기화한다.
2-2. 테스트 케이스를 String타입으로 str변수에 입력받는다.
2-3. str.length()로 문자 길이만큼 반복한다.
1) 만약 첫문자(char)가 'O' 이라면 점수 score++ 후 sum에 더한다.
2) 아니라면 score = 0 으로 초기화시킨다.
(왜냐하면 연속된 정답이면 점수를 올리고 아니면 처음부터니까)
2-4. 테스트케이스의 점수 sum을 출력한다.
풀이1
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class No_8958 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
String str;
int score;
int sum;
for (int i = 0; i < N; i++) {
sum = 0;
score = 0;
str = br.readLine();
for (int j = 0; j < str.length(); j++) {
if (str.charAt(j) == 'O') {
score++;
sum += score;
} else {
score = 0;
}
}
sb.append(sum).append('\n');
}
System.out.println(sb);
}
}
알고리즘대로 풀었다.
테스트케이스의 연속된 정답 점수 score와 테스트케이스의 점수합 sum이다.
지금은 한줄의 테스트 케이스 "OOXOXXXOO" 를 받아서 charAt()으로 문자 하나씩 빼서 썼다면,
이번에는 바로 받아서 배열로 쓸 수 없을까해서 for-each문을 생각했다.
그래서 String에 배열로 만들어서 반환하는 메서드를 찾았다.
바로 toCharArray() 와 getBytes() 이다.
이 부분은 한번 찾아서 블로그에 써 볼 예정이다.
풀이2
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));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
int sum = 0;
int score = 0;
for (char c : br.readLine().toCharArray()) {
if (c == 'O') {
score++;
sum += score;
} else {
score = 0;
}
}
sb.append(sum).append('\n');
}
System.out.println(sb);
}
}
풀이 1과 다른점이 입력을 받고 비교하는 방식이다.
풀이 1은 String으로 받아서 charAt()으로 문자 하나씩 빼서 비교했다면,
풀이 2는 Char[] 배열로 받아서 배열의 값을 꺼내서 비교한 방식이다.
풀이3
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));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
int sum = 0;
int score = 0;
for (byte b : br.readLine().getBytes()) {
if (b == 'O') {
score++;
sum += score;
} else {
score = 0;
}
}
sb.append(sum).append('\n');
}
System.out.println(sb);
}
}
풀이 2와 같은 방식이다. char[] 방식에서 byte[] 방식으로 바뀌었을 뿐이다.
'코딩테스트 > Java - 백준' 카테고리의 다른 글
[백준] 15596번 - Java(자바) (0) | 2022.02.03 |
---|---|
[백준] 4344번 - Java(자바) (0) | 2022.01.30 |
[백준] 1546번 - Java(자바) (0) | 2022.01.27 |
[백준] 3052번 - Java(자바) (0) | 2022.01.25 |
[백준] 2577번 - Java(자바) (0) | 2022.01.23 |