1. 유형
구현
2. 자료구조
HashSet, 2차원 클래스 배열
3. 구현 기능
- 모양,색,배경을 나타내는 map구현
- 9개중에서 3개 조합
- 결! 인지 판단하는 함수
- 점수 계산 코드
4. 풀이
- 모양, 색, 배경색을 필드값으로 하는 2차원 클래스 배열을 생성
String type;
String color;
String back;
public Pair(String type, String color, String back) {
super();
this.type = type;
this.color = color;
this.back = back;
}
}
- 9C3 조합
static void comb(int arrIdx, int pickNum) {
if (pickNum == 3) {
if (checkHap()) {
String tmp = String.valueOf(arr[0] + 1) + String.valueOf(arr[1] + 1) + String.valueOf(arr[2] + 1);
ans.add(tmp);
}
return;
}
if (arrIdx == 9) {
return;
}
arr[pickNum] = arrIdx;
comb(arrIdx + 1, pickNum + 1);
comb(arrIdx + 1, pickNum);
}
-결
일단 모양이 모두 같은지, 모두 다른지 판단
모양색, 배경색도 똑같이 코드 복붙하면 됨
if ((map[ar][ac].type.equals(map[br][bc].type) && map[ar][ac].type.equals(map[cr][cc].type))
|| (!map[ar][ac].type.equals(map[br][bc].type) && !map[ar][ac].type.equals(map[cr][cc].type)
&& !map[br][bc].type.equals(map[cr][cc].type))) {
} else {
return false;
}
-결 판단
결을 한번도 외치지 않았을때만 +3점을 얻음. 이거 조심
if (cmd == 'H') {
int s[] = new int[3];
for (int j = 0; j < 3; j++) {
s[j] = Integer.valueOf(st.nextToken());
}
Arrays.sort(s);
String hap = String.valueOf(s[0]) + String.valueOf(s[1]) + String.valueOf(s[2]);
if (ans.contains(hap)) {
score += 1;
ans.remove(hap);
} else {
score -= 1;
}
} else if (cmd == 'G') {
if (!useG && ans.size() == 0) {
score += 3;
useG = true;
}
else
score -= 1;
}
코드.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class Main {
static class Pair {
String type;
String color;
String back;
public Pair(String type, String color, String back) {
super();
this.type = type;
this.color = color;
this.back = back;
}
}
static Pair map[][];
static int arr[];
static Set<String> ans;
static int N, score = 0;
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
map = new Pair[3][3];
int r, c;
String type, typeColor, backColor;
arr = new int[3];
ans = new HashSet<>();
for (int i = 0; i < 9; i++) {
r = i / 3;
c = i % 3;
st = new StringTokenizer(in.readLine());
type = st.nextToken();
typeColor = st.nextToken();
backColor = st.nextToken();
map[r][c] = new Pair(type, typeColor, backColor);
}
comb(0, 0);
st = new StringTokenizer(in.readLine());
N = Integer.valueOf(st.nextToken());
boolean useG=false;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(in.readLine());
char cmd = st.nextToken().charAt(0);
if (cmd == 'H') {
int s[] = new int[3];
for (int j = 0; j < 3; j++) {
s[j] = Integer.valueOf(st.nextToken());
}
Arrays.sort(s);
String hap = String.valueOf(s[0]) + String.valueOf(s[1]) + String.valueOf(s[2]);
if (ans.contains(hap)) {
score += 1;
ans.remove(hap);
} else {
score -= 1;
}
} else if (cmd == 'G') {
if (!useG && ans.size() == 0) {
score += 3;
useG = true;
}
else
score -= 1;
}
}
System.out.println(score);
}
static void comb(int arrIdx, int pickNum) {
if (pickNum == 3) {
if (checkHap()) {
String tmp = String.valueOf(arr[0] + 1) + String.valueOf(arr[1] + 1) + String.valueOf(arr[2] + 1);
ans.add(tmp);
}
return;
}
if (arrIdx == 9) {
return;
}
arr[pickNum] = arrIdx;
comb(arrIdx + 1, pickNum + 1);
comb(arrIdx + 1, pickNum);
}
static boolean checkHap() {
// 모양, 색, 배경 순서
int a = arr[0];
int b = arr[1];
int c = arr[2];
int ar = a / 3;
int ac = a % 3;
int br = b / 3;
int bc = b % 3;
int cr = c / 3;
int cc = c % 3;
if ((map[ar][ac].type.equals(map[br][bc].type) && map[ar][ac].type.equals(map[cr][cc].type))
|| (!map[ar][ac].type.equals(map[br][bc].type) && !map[ar][ac].type.equals(map[cr][cc].type)
&& !map[br][bc].type.equals(map[cr][cc].type))) {
} else {
return false;
}
if ((map[ar][ac].color.equals(map[br][bc].color) && map[ar][ac].color.equals(map[cr][cc].color))
|| (!map[ar][ac].color.equals(map[br][bc].color) && !map[ar][ac].color.equals(map[cr][cc].color)
&& !map[br][bc].color.equals(map[cr][cc].color))) {
} else
return false;
if ((map[ar][ac].back.equals(map[br][bc].back) && map[ar][ac].back.equals(map[cr][cc].back))
|| (!map[ar][ac].back.equals(map[br][bc].back) && !map[ar][ac].back.equals(map[cr][cc].back)
&& !map[br][bc].back.equals(map[cr][cc].back))) {
} else
return false;
return true;
}
}
5. 느낀점
지니어스에서 본 문제하고 똑같았다.
풀고나니 재밌었다.
'알고리즘 > 백준' 카테고리의 다른 글
백준 16986 - 인싸들의 가위바위보(Java) (0) | 2021.01.17 |
---|---|
백준 20207 - 달력(Java) (0) | 2021.01.17 |
백준 6051 - 시간 여행(Java) (1) | 2021.01.15 |
백준 5587 - 카드 캡터 상근(Java) (0) | 2021.01.13 |
백준 18428 - 감시 피하기(Java) (0) | 2021.01.13 |