백준 16722 - 결! 합!
알고리즘/백준

백준 16722 - 결! 합!

www.acmicpc.net/problem/16722

 

16722번: 결! 합!

위 입력에서 '합'을 이루는 모든 그림 조합은 (1,5,6), (2,3,5), (2,4,6), (2,7,9), (6,8,9) 5가지가 있다.

www.acmicpc.net

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. 느낀점

지니어스에서 본 문제하고 똑같았다.

풀고나니 재밌었다.