프로그래밍/JAVA

[JAVA] 백준 8958 OX퀴즈 (String과 char 자료형의 차이, charAt())

pxatd 2021. 4. 15. 22:46
728x90

문제

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.

"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.

OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.

첫째 줄에 테스트 케이스의 개수가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 길이가 0보다 크고 80보다 작은 문자열이 주어진다. 문자열은 O와 X만으로 이루어져 있다.

학습

앞 문제와 비슷하게 문제에서 제시하는 대로 풀면 된다. 나는 로직을 다음과같이 세웠다.

 

1. 문자를 입력받는 배열을 선언한다.

2. for반복문을 총 두 번 반복하는데 한번은 array의 크기만큼을, 또 한번은 array배열 한 칸에 할당된 크기만큼을 배열의 크기 값을 가진 length 필드 사용하여 반복한다.

3. 입력받은 값을 if조건문에서 문자 'O'가 나오면 cnt를 증가시킨다.

4. X는 cnt를 0으로 초기화시킨다. 

5. 반복문이 끝나면 cnt의 합인 sum을 출력한다.

 

JAVA에서 배열에 문자열을 넣는 문제는 처음이라 char이나 String의 사용에 있어 미숙해 다른분의 코드를 참고하였다. 문자열을 배열로 입력받는 코드를 작성하던 중 char과 String의 차이점에 대해 의문이 생겼다. String 타입으로 배열을 선언한 후 배열에서 데이터를 찾을때는 .charAt이라는 메소드를 사용했기 때문이다. C에서는 배열에 문자열을 입력할 때 char 배열로 선언 후 scanf("%s(=string)",args);로 입력받는 형태를 가지는데 이것과 비슷한 것인지도 궁금하여 공부해보았다. 

 

*오류 

또한, 코드를 작성하다가 String으로 선언한 배열에서 == 부호를 작성하였더니 이런 오류가 발생하였다. (오류내용 : Incompatible operand types String and char) 

 

 

 

char과 String의 차이

 

1. 글자수의 제한

char은 1개의 문자를 담을 수 있는 반면 ( = 문자 )

String은 제한없이 문자를 담을 수 있다. ( = 문자열 )

 

2. 내용물의 차이

char은 해당 변수 안에 값을 직접적으로 가지고 있다. 즉, 다르게 말하면 해당 값이 있는 좌표를 가지고 있지 않다. 

 

String은 char과 달리 클래스타입의 변수이기에 생성 시 해당 변수 안의 값을 가지는게 아니라 임의로 만들어진 값이 들어있는 위치의 좌표를 내용물로 가진다. 

 

char a = 'A' 라면 변수 a 안에는 A라는 값이 있지만 

String abc = 'ABC'는 변수 abc안에 값 'ABC'가 있는것이 아니라 'ABC' 텍스트가 위치한 임의의 좌표 'xxxxxxxx' 를 가진다. 

 

3. 둘의 차이로 발생하는 오류

이 차이에서 발생하는 것이 ==의 사용 가능 여부이다. char같은 경우 값이 같다면 ==를 사용할 수 있지만 String은 내용이 같더라도 String 생성 시 마다 서로 다른 좌표가 생성되기에 ==를 사용하면 같지않다는 결과가 나온다. 따라서, 이를 위한 해결책으로 .equals() 메소드를 이용하여 String 내용물이 실제로 같은지를 확인하여야 한다. (=>오류 해결)

 

추가적으로 String 문자열에서 하나의 문자만 꺼내오고 싶을 때 .charAt() 메소드를 사용할 수 있다.

 

 

charAt 메소드는 문자열에서 지정된 index에 있는 한 문자를 가져온다. 

 

-

나는 개인적으로 이렇게 맨땅에 헤딩하듯이 아무런 지식도 갖추지 않은 상태에서 모르는 부분이 나오면 찾아 알아가는 식의 공부에 흥미를 많이 느끼는 것 같다. 텅 빈 곳간에 쌀가마니를 차곡차곡 쌓는듯한 재미가 있다. 

 

코드

import java.util.Scanner;

public class Main {
// 배열 선언, 입력받은 값으로 if조건문 판별,X가 나오기전까지 점수 합산
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
	
		String arr[] = new String[sc.nextInt()];
		
		for (int i=0; i<arr.length;i++) {
			arr[i] = sc.next(); //string은 next();
		}
		sc.close();
		
		for (int i=0; i<arr.length; i++) {
			
			int sum=0;
			int cnt=0;
			
			for (int k=0; k<arr[i].length(); k++) {
				
				if(arr[i].charAt(k) == 'O') {
					cnt++;
				}
				else {
					cnt=0;
				}
				sum+=cnt;
			}
			
			System.out.println(sum);			
		}
	}
}
출처

www.acmicpc.net/problem/8958

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

 

728x90