๊ณจ๋3
์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ๋ฌด์กฐ๊ฑด 25๋ก ๊ณ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋ ๋ฉด์์ ๋๋ํ๋ค๊ณ ํ ์ ์๋ค.
์
๋ ฅ์ ๊ทธ๋๋ก ๋ฐ๋ ๊ฒ์ด ์๋, ์ขํ ๊ฐ๊ณผ ๊ธ์๋ฅผ ํ๋๋ก ๊ฐ๋ ๋
ธ๋ ํด๋์ค์ ์งํฉ์ผ๋ก ๋ฐ๋๋ค. ์กฐํฉ์ ์์ฑํ๋ ๋ฉ์๋์์ .get(int idx)
๋ฉ์๋๋ฅผ ํ์ฉํ ์ผ์ด ์ฆ์ ๊ฒ ๊ฐ์ ArrayList<Node>
๋ก ๊ตฌํํ๋ค.
static class Node {
int y, x;
char val;
Node(int y, int x, char val) {
this.y = y;
this.x = x;
this.val = val;
}
@Override
public String toString() {
return "(" + y + ","+x+")=> "+val+"\t";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + y;
result = prime * result + x;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Node other = (Node) obj;
if (y != other.y) return false;
if (x != other.x) return false;
return true;
}
}
equals
์ hashCode
๋ ๋ค์ ์น์
์์ 7๊ฐ์ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋์๋์ง์ ์กฐ๊ฑด์ ๋ง์กฑ์ํค๋์ง ํ์ธํ๋ ์์
์ ์ํด ๊ตฌํํด๋๋ค.
์ด ์กฐ๊ฑด์ ๊ธ์์ ๊ฐ๊ณผ ๋ฌด๊ดํ๊ฒ ์ขํ ๊ธฐ์ค์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ๋ง์กฑ๋๊ธฐ ๋๋ฌธ์ equals
์ hashCode
๋ฉ์๋ ๋ํ ๊ธ์์ ๋ํ ์์กด์ฑ์ ์ ๊ฑฐํ๋ค.
private static void makeCombinations(ArrayList<Node> students, int depth, int start, boolean[] visited, Node[] result) {
if (depth == 7) {
if (satisfiesCondition(result)) count++;
return;
}
for (int i = start; i < students.size(); i++) {
if (!visited[i]) {
result[depth] = students.get(i);
visited[i] = true;
makeCombinations(students, depth+1, i+1, visited, result);
visited[i] = false;
}
}
}
private static boolean satisfiesCondition(Node[] result) {
int sCount = 0;
for (int i = 0; i < 7; i++) {
if (result[i].val == 'S') sCount++;
}
if (sCount < 4) return false;
return isConnected(result);
}
์ฐ์ ์กฐํฉ์ ๊ธ์ ์ค 4๊ฐ ์ด์์ด S์ธ์ง ํ์ธํ ๋ค์, ์กฐํฉ์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค
private static boolean isConnected(Node[] result) {
int[] dy = {-1, 1, 0, 0};
int[] dx = {0, 0, -1, 1};
Set<Node> nodes = new HashSet<>(List.of(result));
ArrayDeque<Node> queue = new ArrayDeque<>();
Set<Node> visited = new HashSet<>();
queue.addLast(result[0]);
visited.add(result[0]);
while (!stack.isEmpty()) {
Node curr = queue.pollFirst();
int y = curr.y;
int x = curr.x;
for (int i = 0; i < 4; i++) {
int ny = y + dy[i];
int nx = x + dx[i];
Node n = new Node(ny, nx, '0');
if (nodes.contains(n) && !visited.contains(n)) {
queue.addLast(n);
visited.add(n);
}
}
}
return visited.size() == nodes.size();
}
์กฐํฉ์ด ์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ BFS๋ก ํ์ธํ๋ค.
ArrayDeque<Node> queue
๋ BFS๋ฅผ ์ํ ํ๋ก ์ฌ์ฉํ๊ณ , Set<Node> visited
๋ ๋ฐฉ๋ฌธ๋ ๋
ธ๋๋ฅผ ๊ธฐ๋กํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
int[] dy
์ int[] dx
์ ๋ํ ๋ฃจํ๋ก ์ฌ๋ฐฉํ์์ ์งํํ๊ณ , ์กฐํฉ์ ๋
ธ๋์ ์ผ์น (์ขํ ๊ฐ์ ๋ํด)ํ๋ค๋ฉด ๋ฐฉ๋ฌธ ๋
ธ๋ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ค.
BFS๊ฐ ๋๋๊ณ ๋์๋ ์กฐํฉ์ ๋ชจ๋ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ๋์๋์ง, ๊ฐ ์๋ฃ๊ตฌ์กฐ์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ์ฌ ๋ฆฌํดํ๋ค
3๋ฒ๊ณผ 4๋ฒ์ ์กฐ๊ฑด์ด ๋ชจ๋ ๋ง์กฑ๋ ์กฐํฉ์ ๋ํด์๋ static int count
๋ณ์๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
์๋ฌธ๋ ์น ๊ณต์ฃผ ๋ฐฑ์ค#1941 ํ์ด ์ฝ๋
์ฐ๊ฒฐ๋์ด ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ฝ๋์์ ์กฐ๊ธ ํท๊ฐ๋ ค์ ์๊ฐ์ ๋ญ๋นํ๋๊ฒ ์กฐ๊ธ ์์ฌ์์ผ๋ก ๋จ๋๋ค. ํ์ง๋ง ๋์ฒด๋ก ํธ๋ ์ฌ๋ฏธ๊ฐ ์๋ ๋ฌธ์ ์๋ค.
๊ณจ๋5
์ํ๋ฒณ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ค๋ ๊ฒ์ ์์๊ฐ ๋ค๋ฅธ ์์ด์ ๊ณ ๋ คํ ํ์๊ฐ ์๋ค๋ ์๋ฏธ๋ก ์กฐํฉ์ด๋ผ ๊ฒฐ์ ํ๋ค. ๋ํ, L๊ณผ C์ ์ต๋๊ฐ์ด 15๋ก ์๊ธฐ ๋๋ฌธ์ ์กฐํฉ์ ํด๋ณด๊ธฐ ๋ฑ ์ข์ ํฌ๊ธฐ๋ผ ํ๋จํ๋ค.
Arrays.sort(characters);
makeCombinations(characters, new char[L], 0, 0,L, new boolean[C]);
์ํ๋ฒณ์ ์ ๋ ฌํด์ผ์ง ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋ ์ํธ๋ง ์์ฑํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑ์ํฌ ์ ์๋ค.
private static void makeCombinations(char[] characters, char[] result, int depth, int start, int L, boolean[] visited) {
if (depth==L) {
if (satisfiesCondition(result)) sb.append(arrToString(result)).append("\n");
return;
}
for (int i = start; i < characters.length; i++) {
if (!visited[i]) {
visited[i] = true;
result[depth] = characters[i];
makeCombinations(characters, result, depth + 1, i+1, L, visited);
visited[i] = false;
}
}
}
์กฐํฉ ๋ฉ์๋์ ์ธ์๋ก int start
๋ฅผ ํฌํจํด์ ๋งค๋ฒ ๊ณ ๋ฅด๋ ์ํ๋ฒณ ๋ค์ ์์๋ถํฐ ์ํ๋ฒณ์ ๊ณ ๋ฅผ ์ ์๋ค. ์ด๋ ๊ฒ ์์ฐ์ค๋ ์ค๋ฆ์ฐจ์ ์กฐ๊ฑด์ ๋ง์กฑ์ํฌ ์ ์๋ค.
private static boolean satisfiesCondition(char[] result) {
int vowels = 0, consonants = 0;
for (char c : result) {
switch (c) {
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
vowels++;
break;
default:
consonants++;
}
}
return vowels >= 1 && consonants >= 2;
}
์ฌ์ค ์ด๋ ค์ด ๋ฌธ์ ๋ ์๋์๋๋ฐ ์กฐ๊ฑด์ ์ ๋๋ก ์ ์ฝ์ด์ ์ค์ํ๋ค
์ค๋ฒ1
์์๋ฅผ ๋ณ๊ฒฝํ ์ ์์ผ๋๊น ์ธ๋ฑ์ค๊ฐ ์ค์ํ์ง ์๋ค. ํธ๋ญ๋ค์ ๊ทธ์ ์ ์์๋ถํฐ ๊ฐ๋ฅํ๋ฉด ๋ค๋ฆฌ ๊ฑด๋๊ธฐ๋ฅผ ์์ํ๋ฉด ๋๋ค
์ด ํํธ๋ก ํ๋ฅผ ์๊ฐํด๋ผ ์ ์๋ค. ํธ๋ญ์ ๋ชจ๋ ํ์ ๋ด์๋๊ณ , ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋ ํธ๋ญ๋ค์ ํ์์ ์ ๊ฑฐํ๋ฉด ๋๋ค. ํธ๋ญ์ ๋ด์ ํ๊ฐ ๋น์์ผ๋ฉด ํธ๋ญ๋ค์ด ๋ชจ๋ ๊ฑด๋์์ ์๋ฏธํ๋ค.
๊ทธ๋ผ ํธ๋ญ์ด ๊ฑด๋๋์ง๋ ์ด๋ป๊ฒ ํ์ธํ ์ง ๊ณ ๋ฏผํ๋ค๊ฐ, key ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ๋๋ TreeMap์ ๋ด๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
๋ค๋ฆฌ์ ์ ์ฅํ ์๊ฐ์ key๋ก, ํธ๋ญ ๋ฌด๊ฒ๋ฅผ value๋ก ๊ฐ๋ pair๋ฅผ ์ฌ์ฉํด์ ์ ์ฅํ๊ณ ์ง๋ ์๊ฐ์ด ๋ค๋ฆฌ์ ๊ธธ์ด๋ณด๋ค ๊ฐ๊ฑฐ๋ ๊ธด์ง ํ์ธํ๋ฉด ๋๋ค. true๋ฉด TreeMap์์ ํด๋น entry๋ฅผ ์ ๊ฑฐํ๊ณ , ๋ค๋ฆฌ ์ ๋ฌด๊ฒ์์๋ ํด๋น ํธ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋นผ์ ์ ๋ฐ์ดํธํ๋ค
ํ์ฌ ๋ฌด๊ฒ ์ดํฉ์ ๋ค์ ํธ๋ญ์ ๋ฌด๊ฒ๋ฅผ ๋ํด๋ ์ต๋ ํ์ค์ ๋์ด๊ฐ์ง ์์ผ๋ฉด ํธ๋ญ์ด ์ ์ฅํ ์ ์๋ค.
์
์ฅ์ ํธ๋ญ ํ์์ ํด๋น ํธ๋ญ์ pollFirst
ํ๊ณ , ์๊ฐ์ ๊ด๋ฆฌํ๋ TreeMap์ ์
์ฅ์ (time, weight)์ผ๋ก ๊ธฐ๋กํ๋ฉด ๋๋ค
์ต๋ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ ์ ๊ทผ์ ์ฐ์ ์ํด์ผ๊ฒ ๋ค๊ณ ๋ค์๊ธ ์๊ฐํ๋ค. ํ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค๋ฅ๋ ์ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋์ ๋ฃจํ ์์ ์ฒ๋ฆฌ ์์๋ฅผ ๋ ์ ์คํ๊ฒ ๊ณ ๋ฏผํด์ผ๊ฒ ๋ค. ์ด ๋ฌธ์ ์์๋ ๋ค๋ฆฌ๋ฅผ ๋ค ๊ฑด๋ ํธ๋ญ์ด ๋๊ฐ๊ณผ ๋์์ ์๋ก์ด ํธ๋ญ์ด ๋ค์ด์ฌ ์ ์์๋ค. ๋ก์ง์ ๊ตฌํํ ๋ ๋ฃจํ ๋ด์์ ์๋ก์ด ํธ๋ญ์ด ๋ค์ด์ฌ ์ ์๋์ง ์ฌ๋ถ๋ถํฐ ํ์ธํ๊ณ ๋์ ํธ๋ญ์ด ๋ค๋ฆฌ๋ฅผ ๊ฑด๋๋์ง ํ์ธํ๋ ์ค์๋ฅผ ์ ์ง๋ ๋ค.
D4
๋๋ ์ผ์ชฝ์ผ๋ก ๋ฐ๋ฆฌ๋ ์ํฉ๋ง ๊ตฌํํ๊ณ ์ ํ๋ค. ๊ทธ๋์ ๋๋จธ์ง (์ค๋ฅธ์ชฝ, ์์ชฝ, ์๋ซ์ชฝ) ๋ฐ๋ฆฌ๋ ์ํฉ์ rotate90
ํจ์๋ก ํด๊ฒฐํ๋ค
์ด๋ ๋ฐฉํฅ์ด up์ด๋ฉด rotate90
์ 3๋ฒํด์ ์ผ์ชฝ์ผ๋ก ๋ฏธ๋ ์ํฉ์ ๊ตฌํํ ๋ค์ rotate90
์ 1๋ฒ ํด์ ๋ฐฉํฅ์ ์์๋ณต๊ตฌ ์์ผฐ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํ ์ ์์๋ ๊ฐ์ฅ ๊ฒฐ์ ์ ์ธ ์์ธ์ 0 ์ ์ ๊ฑฐํ ๊ฒ์ด๋ค. ์ฒ์์๋ ํฌํฌ์ธํฐ๋ฅผ ํ๋ ค๊ณ ํ๋๋ฐ, ๊ทธ๋ฆฌ๋์์ ๊ฐ์ด ๋ณ๊ฒฝ ๋๋ฉด์ ํฌ์ธํฐ 2๊ฐ๊น์ง ๊ด๋ฆฌํ๋ ค๊ณ ํ๋ ๋จธ๋ฆฟ์์์ ๋ณต์กํด์ก๋ค.
๊ทธ๋์ NxN ๊ทธ๋ฆฌ๋๋ฅผ N๊ฐ์ ArrayDeque
(row)๋ก ์๊ฐํ๊ณ ํ์๋ค. ์ด row์๋ 0 ์ด ์๋ ์ซ์๋ง ํฌํจ์์ผฐ๋ค.
0 ์ ์ ์ธ์ํจ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ๋ค
๊ฐ์ ์ซ์์ธ์ง ํ์ธํด์ ์ ์ ํฉ์น๋ ๋ก์ง์์ ํ์ฌ ์ซ์์ ๋ค์ ์ซ์๊ฐ 0์ด๋ฉด, ํ์ฌ ์ซ์์ ๋ค๋ค์ ์ซ์๋ฅผ ๋น๊ตํ๋ค. ์ฆ, 0์ด ์๋ ์ซ์๋ฅผ ๋ง๋ ๋๊น์ง ๋น๊ตํ๋ 0์ด ํ์ํ์ง ์๋ค
์ซ์๊ฐ ํฉ์ณ์ง์ง ์๋๋ผ๋ ์ฐ์ 0์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ชจ๋ ๋ฐ๋ฆฐ๋ค.
๊ทธ๋์ 0 ์ ๋ค์ ๊ฒฐ๊ตญ ์ฐ์ฐ์ด ๋ชจ๋ ๋๋ ๋ง์ง๋ง์ ๋น ์ ๋ค์ ๊ฐ์ ์ฑ์์ฃผ๊ธฐ ์ฉ์ผ๋ก ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค
์ฐ์ ArrayDeque์ ์ซ์๋ ๋ชจ๋ 0์ด ์๋๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ค์ ์ซ์์ ๊ฐ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ๊ฒฐ๊ณผ ArrayDeque์ ๊ทธ๋๋ก ๋ค์ด๊ฐ๋ค.
๋๋ ์ผ์ชฝ์ผ๋ก ๋ฐ๋ฆฌ๋ ์ํฉ์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ row์ ์๋ถํฐ ์ํํ๋ฉด์ ํฉ์ณ์ง ์ ์๋์ง ํ์ธํ๋ค. ํฉ์ณ์ง ์ ์๋ค๋ฉด ArrayDeque์ ๋์ ์ถ๊ฐํ๊ณ , ํฉ์ณ์ง ์ ์๋ค๋ฉด ๋ ์ซ์์ ํฉ์ ArrayDeque์ ์ถ๊ฐํ๋ฉด ๋๋ค.
ํฉ์ณ์ง ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๋ชจ๋ ํ์ธํด์ ๊ฒฐ๊ณผ ArrayDeque์ ์์ฑํ๋ค๋ฉด ๊ทธ๋ฆฌ๋ ํด๋น row์ ๊ฐ์ ํ๋์ฉ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
2-1์์ 0 ์ ์ ์ธ์์ผฐ๊ธฐ ๋๋ฌธ์ ์ด ArrayDeque์ด ๊ทธ๋ฆฌ๋์ ์ปฌ๋ผ ์๋ณด๋ค ์์ ์ ์์ง๋ง, ์ด์ฐจํผ 0์ผ๋ก ์ด๊ธฐํ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๊ด ์ธ ํ์ ์๋ค.
์ด ๋ฌธ์ ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ ํ์ฉํ๋ ๊ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ๊นจ๋ฌ์ ํ์ด์๋ค.
ํฌํฌ์ธํฐ๋ฅผ ์จ์ ๋ฐฐ์ด์ ๊ทธ๋๋ก ์ฌ์ฉํ ํ์ด๋ ์์ผ๋, ๋๋ ๋ด์ฅ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ ํ์ด๊ฐ ๋ก์ง์ด๋ ์ปดํ์ผ/๋ฐํ์ ์ค๋ฅ๋ฅผ ์ต์ํํ๋ค๊ณ ์๊ฐํ๋ค.
์ค๋ฒ1
Next Permutation ์ ์ ๋ฌธ์ ๋ค. ์ด 3๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ํํ๋ค.
pivot
์ด๋ผ ๋ถ๋ฅธ๋ค. ์ฌ์ ์ ์ ๋ ฌ์ ๊ฐ์ ํ๋ฉด 123456789์ ์งํ ์์๋ 123456798์ด๋ค. ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ค๋ถํฐ ์ค์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
pivot
์ ์ฐพ์๋ค๋ฉด ๋ค์ ๋ท์ชฝ๋ถํฐ ์ํํ๋ฉฐ ์ด pivot
๊ณผ ์ค์ํ , pivot
์ ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์์๋ฅผ ์ฐพ์์ผ ํ๋ค. 123456798์ ๋ค์ ์์๋ 123456879๋ค. 123456798์ pivot์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์,
arr[i]
์arr[i+1]
๊ฐ ์ฌ์ ์์ผ๋ก ์ ๋ ฌ๋์ด ์๋ 7์ด๋ค. successor๋ pivot๋ณด๋ค ํฐ ๊ฐ ์ค ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ ์๋ 8์ด๋ค. ์ด ๋์ ์ค์ํ๋ฉด 123456897์ด๋ค.
pivot
์ธ๋ฑ์ค ๋ค์๊ฐ๋ถํฐ reverse๋ฅผ ์ํํ๋ค2์์ 123456897 ๊น์ง ๊ตฌํ๋๋ฐ, ์ด ๋ pivot์ 7, successor๋ 8์ด์๋ค. pivot ๋ค์ ๊ฐ์ธ 9๋ถํฐ reverseํ๋ฉด 123456879์ ์ป์ ์ ์๋ค.
์ฒ์์ ๋ญฃ๋ ๋ชจ๋ฅด๊ณ ์กฐํฉ์ผ๋ก ํ์๋ค๊ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌ์๋ค. Next Permutation์ ๊ณต๋ถํ๊ณ ๋๋๊น ์ผ๋ง๋ ๋นํจ์จ์ ์ธ ํ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ทผํ๊ณ ์์๋์ง ๊นจ๋ฌ์๋ค.