[백준/BOJ] 1296번 : 팀 이름 정하기 (JAVA / 자바)
안녕하세요~ 코딩하는 코알못 코메인입니다.
https://www.acmicpc.net/problem/1296
1296번: 팀 이름 정하기
연두는 프로그래밍 대회에 나갈 팀 이름을 정하려고 한다. 미신을 믿는 연두는 이환이에게 공식을 하나 받아왔고, 이 공식을 이용해 우승할 확률이 가장 높은 팀 이름을 찾으려고 한다. 이환
www.acmicpc.net
- 문제 -
난이도 브론즈 1 문제이다.


자바에서 입력방식은 scanner와 bufferedreader가 있다.
자바를 초반에 접하면 처음에 배우는 입력은 scanner이다. scanner가 bufferedreader보다 편하지만 속도가 느리다.
bufferedreader는 무조건 문자열로 받아오기때문에 정수형이나 실수형 변수에 저장하기 위해서는 입력과 형변환을 해줘야한다.
더 자세한 내용은 아래 글 참고 하면 좋다.
(JAVA / 자바) Scanner 와 Bufferedreader
안녕하세요~ 코딩하는 코알못 코메인입니다. 이번엔 백준 문제 풀면서 계속 언급될 scanner와 bufferedreader에 대한 간단한 정리를 해볼거다. 자바에서 입력은 scanner와 bufferedreader가 있다. 우선 각자
comain.tistory.com
풀이 방법
연두의 영어이름과 팀 이름에 LOVE의 철자가 몇개씩 들어가 있는지를 파악해서 (L + O) * (L + V) * ... *(V + E)를 연산해줘야한다.
그렇다면 우선 연두의 영어이름에 L,O,V,E가 몇개씩 들어가있는지와 침 이름에 몇개씩 들어가 있는지를 구한다.
L 개수, O 개수, V개수, E개수를 구해서 위 공식으로 계산해준다. 그렇게해서 나온 값들을 mod 100 해주고 나온 값들중 제일 큰 값을 가진 팀을 출력해주면 된다.(mod란 %. 즉 나머지를 구하란 뜻이다.)
영어이름과 팀 이름들은 문자열로 받는다. 문자열 안에 L,O,V,E가 몇개 있는지는 replace 함수를 사용해 얻을 것이다.
replace는 문자열에서 특정 문자를 지우는 함수이다.
방식은 replace를 하기 전 문자열 길이에서 replace를 하고 난 뒤의 문자열의 길이를 빼주면 제외한 특정 문자의 개수를 알 수 있다. 이렇게 구한 값들을 배열에 저장한다. 배열은 LOVE의 철자 개수인 4개 크기로 만들어 준다. 배열에 철자 별 개수가 저장이 되었으면 0인덱스부터 3인덱스까지 순차적으로 연산 방식을 도입해 연산해준다. 그렇게 나온 값들로 100으로 나눈 나머지를 구하고 최댓값을 구해서 제일 확률이 큰 팀의 이름을 출력한다.
하지만 최댓값인 팀이 여러 팀일 수 있다. 그럴때는 사전적으로 앞에오는 팀 이름을 출력하라고 한다. 그럼 그 팀 들을 배열에 넣고 정렬을 해서 0인덱스에 위치한 값을 출력하면 된다.
-풀이-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
//LOVE 철자마다 개수를 저장하기 위한 배열
static int[] arr = new int[4];
//최댓값은 100으로 나눴을때 0이 올 수도 있기 때문에 -1로 선언
static int max = -1;
static String love = "LOVE";
//우승확률이 높은 팀 이름을 저장하기 위한 변수
static String win = "";
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String Ename = br.readLine();
int N = Integer.parseInt(br.readLine());
for(int i = 0; i < N; i++) {
String Tname = br.readLine();
//L부터 E까지 순차적으로 팀 이름과 연두 이름에 포함된 개수를 배열에 저장
for(int j = 0; j < 4; j++) {
int sum = Ename.length() - Ename.replace(String.valueOf(love.charAt(j)), "").length();
sum += Tname.length() - Tname.replace(String.valueOf(love.charAt(j)), "").length();
arr[j] = sum;
}
//(L+O) × (L+V) × (L+E) × (O+V) × (O+E) × (V+E)의 연산 값을 저장하기 위한 변수
int total = 1;
//연산하는 반복문
for(int j = 0; j < 4; j++) {
for(int k = (j + 1); k < 4; k++) {
total *= (arr[j] + arr[k]);
}
}
//현재 확률 최댓값과 이번 팀이름의 확률 값이 같을때
if(max == (total % 100) && win != "") {
String[] arr2 = new String[2];
arr2[0] = win;
arr2[1] = Tname;
Arrays.sort(arr2);
win = arr2[0];
}
//팀이름의 확률 값이 더 클때
if(max < (total % 100)) {
max = total % 100;
win = Tname;
}
}
System.out.println(win);
}
}
-결과-

아직 코딩 공부가 부족한 필자라 설명과 풀이 방법이 많이 미흡할 수 있다. 코딩 고수분들은 보시고 문제점이 있다면 댓글로 말해주시면 감사한 마음으로 참고 수정 하겠습니다.