[자바] 백준 8958 : OX 퀴즈

20260 단어 자바자바

문제


풀이01

  1. ox를 사용자에게 배열 크기를 받아 저장한다
String[] input = new String [Integer.parseInt(br.readLine())];
  1. 이중 for문을 이용해 줄단위로 알파벳 단위로 검사한다
첫번째 for문은
OOXXOXXOOO
OOXXOOXXOO
를 줄 단위로 검사하고,
다음 for문은
OOXXOXXOOO
이렇게 각각 한 줄을 검사하면서 O를 검사한다

제출 코드 01

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[] input = new String [Integer.parseInt(br.readLine())];
		
		// for문을 돌리면서 배열에 내용물 넣기
		for(int i=0; i<input.length; i++) {
			input[i] = br.readLine();
		}
		
		// 배열길이만큼 돌면서 검사할것이라는 for 문
		// 줄 단위로 넘겨줄 for 문
		for(int i=0; i<input.length; i++) {
			// 한줄 검사하고 다음 줄 검사로 넘어갈 때마다
			// 누적된 값을 초기화 해주어야 하니 여기에 변수 설정
			int cnt = 0;
			int sum = 0;
			// 한 줄에서 'O' 가 있는지 검사하는 for문
			for(int j=0; j<input[i].length(); j++) {
				// 만약 줄을 검사하변서 'O'가 있다면 cnt에 +1을 해주어라
				if (input[i].charAt(j) == 'O') {
					cnt++;
				} else {
					cnt = 0;
				}
				sum += cnt;
			}
			System.out.println(sum);
		}
	}
}

풀이 02

또 다른 풀이가 없을까 하여 검색하다가 아직 제대로 이해하지 못한 내용인 StringBuilder를 사용하고 배열을 사용하지 않은 풀이가 있어 공부해보고자 기록한다.
출처 티스토리 (3번째 방법을 참고)

1. StringBuilder

1) 단일 스레드 환경에서만 사용하도록 설계되어 있다.
(멀티 스레드 환경에서는 StringBuffer를 사용한다. 사용방법은 동일)

2) () 안에 초기 버퍼의 크기를 설정할 수 있지만, StringBuilder는 버퍼가 부족할 경우 자동으로 버퍼 크기를 늘리기 때문에 초기 버퍼의 크기가 중요하지 않다.
(만약 (String str)과 같이 생성자를 작성했다면, str로 주어진 매개값을 버퍼의 초기값으로 저장)

// 초기값을 주지 않고 선언
StringBuilder sb = new StringBuilder();
// 초기값을 16으로 주고 선언
StringBuilder sb = new StringBuilder(16);
// 초기값을 "java"의 매개값으로 주고 선언
StringBuilder sb = new StringBuilder("java");

3) 문자열을 결합하는 +연산자를 많이 사용할 수록 프로그램 성능을 느리게 하는 요인이 된다. 따라서 문자열을 변경하는 작업이 많을 경우에 StringBuilder(혹은 StringBuffer)를 사용하는 것이 좋다.

4) 내부 버퍼에 문자열을 저장해두고, 그 안에서 수정, 추가, 삭제 작업을 할 수 있도록 설계되어 있다.
-> String처럼 새로운 객체를 만들지 않고도 문자열을 조작할 수 있는 것이다

StringBuilder 객체 생성후 버퍼 내에서
문자 추가, 삽입, 삭제 등의 작업을 할 수 있는 메소드

append(---) 			<- 끝에 주어진 매개값을 추가
insert(int offset, ---)		<- 중간에 주어진 매개값을 추가
delete(int start, int end)	<- 일부분을 삭제
deleteCharAt(int index)		<- 주어진 index의 문자를 삭제
StringBuilder reverse()		<- 순서를 뒤집음
setCharAt(int index, char ch)	<- 주어진 index의 문자를 다른 문자로 바꿈
replace(int start, int end, String str)	<-문자열의 일부분을 다른 문자열로 바꿈
  1. 향상된 for문을 사용한다.
for (받아서 저장할 변수 : 넣어줄 배열, 문자열…)
  1. 사용자에게 받은 문자열을 byte단위로 쪼갠다
br.readLine(0.getBytes())

제출코드

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를 사용해주기 위해 선언한다.
		StringBuilder sb = new StringBuilder();
		
		// 첫번째로 ox 문제가 몇 줄 들어올 건지 입력한다 했으니
		// for문을 돌릴 횟수(숫자)를 받는다.
		int num = Integer.parseInt(br.readLine());
		
		for(int i=0; i<num; i++) {
			// 돌릴때마다 초기화 해주기 위해 여기에 선언 및 초기화
			int cnt = 0; 
			int sum = 0;
			// ox를 받는데 그걸 Byte화 시켜서 result에 넣는다.
			for (byte result : br.readLine().getBytes()) {
				// 만약 result에 'O'가 있다면 cnt에 +1
				if (result == 'O' ) {
					cnt++;
					sum += cnt;
				} else {
					cnt = 0;
				}
			}
			// StringBuilde에 sum을 넣어주고
            		// 출력할때 줄 단위로 각각 나오도록 개행('n')
			sb.append(sum).append('\n');
		}
		// 조작한 문자열을 넣어준다.
		System.out.println(sb);
	}
}


시간이나 길이차이가 크게 나지는 않는다.

좋은 웹페이지 즐겨찾기