์ถ์ฒ: ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉ ํ ์คํธ ์ฐ์ต, https://school.programmers.co.kr/learn/challenges
ํ์ด๊ณผ์
์ฐ์ ๋ฐฉ์ด ์์ฑ๋๋ ์กฐ๊ฑด์ ๋ํด ํ์ ํด์ผ ํฉ๋๋ค.
๋ฐฉ์ด ์์ฑ๋๋ ์กฐ๊ฑด์
1. ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ์ ์ ์ ๋ค์ ๋ฐฉ๋ฌธํด์ผ ํจ
2. ์ด์ ์ ์ฐ๊ฒฐํ ์ ๋ถ์ด ์๋ ์๋ก ์๊ธด ์ ๋ถ์ด์ด์ผ ํจ
๊ฐ ์ ์ ์ ๋ํ ๊ทธ๋ํ๋ฅผ ์ฝ๋๋ก ๋ํ๋ด๋ ๊ณผ์ ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋, ๊ธฐ์กด์ ๊ทธ๋ํ ๋ฌธ์ ์ ๋ค๋ฅด๊ฒ ์ธ์ ํ๋ ฌ์ด๋ ์ธ์ ๋ฆฌ์คํธ๋ก๋ ํด๋น ๋ฌธ์ ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
arrows์ ํฌ๊ธฐ๊ฐ 1 ์ด์ 100,000์ดํ๋ผ๋ ์กฐ๊ฑด์ผ๋ก ์ธํด ์ธ์ ํ๋ ฌ์ ๊ฒฝ์ฐ200_001 * 200_001 ์ ํฌ๊ธฐ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋์ ๊ฐ์ด HashMap ์๋ฃ๊ตฌ์กฐ์ Node ํด๋์ค๋ฅผ ํตํด์ ๊ทธ๋ํ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
class Node{
int r,c;
public Node(int r,int c){
this.r = r;
this.c = c;
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || !(o instanceof Node)) return false;
Node node = (Node)o;
if(node.r==this.r && node.c==this.c) return true;
return false;
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = result*prime + r;
result = result*prime + c;
return result;
}
}
HashMap<Node,List<Node>> map = new HashMap();
HashMap์ ํค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์ ์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ธ์ง ํ์ ์ด ๊ฐ๋ฅํ๋ฉฐ,
value ๊ฐ์ ๋ฐํ์ผ๋ก ํด๋น ์ ๋ถ์ด ์ด๋ฏธ ์ฐ๊ฒฐ๋ ์ ๋ถ์ธ์ง ํ์ ์ด ๊ฐ๋ฅํฉ๋๋ค. (์ด๋ ArrayList์๋ฃ๊ตฌ์กฐ์ contains ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.)
3. ๋๊ฐ์ ์ ๋ถ์ด ๊ต์ฐจํ๋ ๊ฒฝ์ฐ์ ๋ํด์๋ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋๊ฐ์ ์ผ๋ก ์ ๋ถ์ด ๊ต์ฐจํ๊ฒ ๋๋ฉด, ๊ธฐ์กด ๋ก์ง์์ 1๊ฐ์ ๋ฐฉ์ด ์์ฑ๋๋ ๊ฒ์ผ๋ก ํ์ ๋์ง๋ง ์ค์ ๋ก๋ 2๊ฐ์ ๋ฐฉ์ด ์์ฑ๋ฉ๋๋ค.
์ด๋ฅผ ์ํด์ ํ ๋ฒ์ ์ด๋์ 2๋ฒ์ ์ด๋์ผ๋ก ํํํ๋ฉด ๊ต์ฐจ ๊ฒฝ์ฐ์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
for(int a : arrows){
for(int i=0;i<2;i++){
// Node๋ฅผ ํ์ฉํ์ฌ ์ ์ ์ ํ์ํ๊ณ , ์ ๋ถ์ ์ด์ผ๋ฉฐ ๋ฐฉ์ด ์๊ธฐ๋์ง ํ์ธํ๋ ๋ก์ง
}
}
์๊ฒ๋์
- ๊ฐ ์ขํ(r,c) ์ ๋ํ ๋ ธ๋ ๋ฒํธ๋ฅผ ๋ํ๋ด๋๋ฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. Node ํด๋์ค๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ๋ ธ๋๋ฅผ ๋ํ๋ผ ์ ์์์ ์๊ฒ๋์์ต๋๋ค.
- ArrayList ์๋ฃ๊ตฌ์กฐ์ contains ๋ฉ์๋๋ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ , HashMap ์๋ฃ๊ตฌ์กฐ์ contains ๋ฉ์๋๋ O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์๊ฒ๋์์ต๋๋ค.
- equals ๋ฉ์๋์ hashCode ๋ฉ์๋ ์ค๋ฒ๋ผ์ด๋ฉ ๋ฐฉ๋ฒ์ ๋ํด ๋ค์ ํ ๋ฒ ์๊ฒ๋์์ต๋๋ค.
- hashCode์ ๊ฒฝ์ฐ 31์ ์ฌ์ฉํด์ hashCode๋ฅผ ๋ง๋ค์ด ์ค ์ ์์์ ์๊ฒ๋์์ต๋๋ค.
- String์ .hashCode() ์ ๊ฒฝ์ฐ ๋ฌธ์์ด์ด ๊ฐ์ผ๋ฉด ๊ฐ์ hashCode๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
์ ์ฒด์ฝ๋
import java.util.*;
// ๋ฐฉ์ด ์์ฑ๋๋ ์กฐ๊ฑด
// ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ์ ์ && ์ฒ์ ์๊ธด ์ ๋ถ
// ๊ต์ฐจ์ ์ฒ๋ฆฌ (2์นธ ์ฉ ์์ง์ด๋๋ก)
class Node{
int r,c;
public Node(int r,int c){
this.r = r;
this.c = c;
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || !(o instanceof Node)) return false;
Node node = (Node)o;
if(node.r==this.r && node.c==this.c) return true;
return false;
}
@Override
public int hashCode(){
final int prime = 31;
int result = 1;
result = result*prime + r;
result = result*prime + c;
return result;
}
}
class Solution {
int[] dr = {-1,-1,0,1,1,1,0,-1};
int[] dc = {0,1,1,1,0,-1,-1,-1};
int answer;
Map<Node,List<Node>> map;
void solve(int[] arrows){
Node cur_node = new Node(0, 0);
map.put(cur_node,new ArrayList<>());
for(int a : arrows){
for(int i=0;i<2;i++){
Node next_node = new Node(cur_node.r + dr[a],cur_node.c + dc[a]);
if(!map.containsKey(next_node)){ // ์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ง์
map.put(next_node,new ArrayList<>());
}else if(!map.get(next_node).contains(cur_node)){ // ์ฌ๋ฐฉ๋ฌธ ์ง์ ์ด๊ณ ์๋ก ๋ง๋ค์ด์ง ์ ๋ถ์ด๋ฉด answer+1
answer+=1;
}
map.get(next_node).add(cur_node);
map.get(cur_node).add(next_node);
cur_node = next_node;
}
}
}
public int solution(int[] arrows) {
answer = 0;
map = new HashMap<>();
solve(arrows);
return answer;
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ํ๋ก์ธ์ค (์ฐ์ ์์ํ) (0) | 2024.04.02 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์์ (0) | 2024.04.01 |
์ด๋ถํ์ (0) | 2024.03.06 |
visited๋ฐฐ์ด์ด 3์ฐจ์์ธ bfs ์ต๋จ๊ฒฝ๋ก ํ์ ๋ฌธ์ (๋ฐฑ์ค 1600๋ฒ) (2) | 2024.02.28 |
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2024.02.22 |