2023. 11. 24. 16:29ใ์ธํ๋ฐ/์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด ์ ๋ฌธ : ์ฝ๋ฉํ ์คํธ ๋๋น
https://hyejin.tistory.com/1259
-> ์ด์ ๋ฌธ์ ํ์ด
8. ์ก์์ง ์ฐพ๊ธฐ 1 (BFS : Breadth-First Search)
์ค๋ช
ํ์๋ ์ก์์ง๋ฅผ ์์ด๋ฒ๋ ธ๋ค. ๋คํํ ์ก์์ง์๋ ์์น์ถ์ ๊ธฐ๊ฐ ๋ฌ๋ ค ์๋ค.
ํ์์ ์์น์ ์ก์์ง์ ์์น๊ฐ ์์ง์ ์์ ์ขํ ์ ์ผ๋ก ์ฃผ์ด์ง๋ฉด ํ์๋ ํ์ฌ ์์น์์ ์ก์์ง์ ์์น๊น์ง ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ํ๋ค.
์ก์์ง๋ ์์ง์ด์ง ์๊ณ ์ ์๋ฆฌ์ ์๋ค.
ํ์๋ ์ค์นด์ด ์ฝฉ์ฝฉ์ ํ๊ณ ๊ฐ๋๋ฐ ํ ๋ฒ์ ์ ํ๋ก ์์ผ๋ก 1, ๋ค๋ก 1, ์์ผ๋ก 5๋ฅผ ์ด๋ํ ์ ์๋ค.
์ต์ ๋ช ๋ฒ์ ์ ํ๋ก ํ์๊ฐ ์ก์์ง์ ์์น๊น์ง ๊ฐ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์ธ์.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ํ์์ ์์น S์ ์ก์์ง์ ์์น E๊ฐ ์ฃผ์ด์ง๋ค. ์ง์ ์ ์ขํ ์ ์ 1๋ถํฐ 10,000๊น์ง์ด๋ค.
์ถ๋ ฅ
์ ํ์ ์ต์ํ์๋ฅผ ๊ตฌํ๋ค. ๋ต์ 1์ด์์ด๋ฉฐ ๋ฐ๋์ ์กด์ฌํฉ๋๋ค.
์์ ์ ๋ ฅ 1
5 14
์์ ์ถ๋ ฅ 1
3
๋ฌธ์ ํ์ด 1
public class FindTheCalf
{
static int[] ch; // ๊ฐ๋ ์ขํ์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ฐฐ์ด
static int[] jump = { -1, 1, 5 }; // jump -1, 1, 5
public int BFS(int s, int e) // L ์ ํ์ฌ ์์น
{
int answer = 0;
Queue<Integer> Q = new LinkedList<>();
int L = 1; // ์ ํ ํ์
Q.offer(s);
while (!Q.isEmpty())
{
int len = Q.size();
for (int j = 0; j < len; j++)
{
Integer cur = Q.poll();
for (int i = 0; i < jump.length; i++)
{
if (cur + jump[i] > 0)
{
if(cur + jump[i] == e)
{
return L;
}
else if (ch[cur + jump[i]] == 0)
{
Q.offer(cur + jump[i]);
ch[cur + jump[i]] = 1;
}
}
}
}
L++; // ํ ๋ฒ ๋ ์ ํ
}
return L;
}
public static void main(String[] args)
{
FindTheCalf findTheCalf = new FindTheCalf();
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt(); // ํ์์ ์์น
int e = scanner.nextInt(); // ์ก์์ง์ ์์น
ch = new int[10001];
int result = findTheCalf.BFS(s, e);
System.out.println(result);
}
}
๐ฉ๐ป : ์น์ 7์์ ๋๋์ด ๋ด๊ฐ ์ง์ ํ์ด์ ์ ๋ต์ ๊ตฌํ๋ค........โญ
https://hyejin.tistory.com/1258
https://hyejin.tistory.com/1259
๋ถ๋ถ ์งํฉ ํ์ด๋ ์ด์งํธ๋ฆฌ ์ํ BFS ํ์ด์์ ํํธ๋ฅผ ์ป์ด ๋ฌธ์ ๋ฅผ ํ์๋ค.
์ ํ ํ์๊ฐ ์ด์งํธ๋ฆฌ ์ํ BFS ํ์ด์ ๋ ๋ฒจ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ด๋ ๊ฒ ๊ทธ๋ฆผ์ฒ๋ผ ํ ๋ ธ๋์์ -1, 1, 5 ์ด๋ ๊ฒ ์ ํํด์ ๊ฐ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ตณ์ด ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ ๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์๋๋ก ํ๊ธฐ ์ํด์ ๋ถ๋ถ ์งํฉ๋์ฒ๋ผ ๋ฐฐ์ด ch๋ฅผ ๋ง๋ค๊ณ , ํฌ๊ธฐ๋ ์ขํ๊ฐ 10000๊น์ง๋ผ๊ณ ํ์ผ๋ 10000+1 ๋ก ์ด๊ธฐํํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ฉด 1, ์๋๋ฉด 0 ์ผ๋ก ๊ตฌ๋ถํด์ค๋ค.
1๏ธโฃ
static int[] ch; // ๊ฐ๋ ์ขํ์ธ์ง ํ์ธํ๊ธฐ ์ํ ๋ฐฐ์ด
static int[] jump = { -1, 1, 5 }; // jump -1, 1, 5
๋ฐ๋ผ์ ์ด๋ฒ ๋ฌธ์ ์์๋ ch ๋ฐฐ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ 1 ์๋๋ฉด 0 ์ผ๋ก ์ค์ ์ ํด์ค ๊ฒ์ด๊ณ ,
jump ๋ผ๋ ๋ฐฐ์ด์ -1, 1, 5 ์ ํํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์์คฌ๋ค.
2๏ธโฃ
int answer = 0;
Queue<Integer> Q = new LinkedList<>();
int L = 1; // ์ ํ ํ์
Q.offer(s);
๊ทธ๋ฆฌ๊ณ ์ด๋ฒ์๋ Queue๋ฅผ ์ฌ์ฉํด์ ๋ ๋ฒจ์ ๋ฐ๋ฅธ ์์๋ฅผ ๋ด์์ค ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ L์ 1๋ก ์ด๊ธฐํํด๋๋๋ฐ 0์ผ๋ก ํด๋๋๊ณ ์๊ด ์๋ค.
๊ทผ๋ฐ ๋๋ ๊ทธ๋ฅ ํ์์ ์์น๊ฐ ์ก์์ง ์์น์ ๊ฐ์ง๋ ์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ ์ ํ๋ฅผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํด์ 1๋ก ํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌธ์ ๋ณด๋๊น ๋ต์ ๋ฐ๋์ 1 ์ด์์ด๋ฉฐ ๋ฐ๋์ ๋ต์ด ์กด์ฌํ๋ค๊ณ ํ๊ธฐ ๋๋ฌธ์ L์ 1๋ก ์ค๋ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์์ ์์น์ธ s๋ฅผ root ๋ ธ๋๋ก ๋จผ์ Q์ offer ํด์ค๋ค.
(์ด์ ๋ณด๋๊น answer ๋ณ์๋ ํ์ ์์)
3๏ธโฃ
while (!Q.isEmpty())
{
int len = Q.size();
for (int j = 0; j < len; j++)
{
Integer cur = Q.poll();
for (int i = 0; i < jump.length; i++)
{
if (cur + jump[i] > 0)
{
if(cur + jump[i] == e)
{
return L;
}
else if (ch[cur + jump[i]] == 0)
{
Q.offer(cur + jump[i]);
ch[cur + jump[i]] = 1;
}
}
}
}
L++; // ํ ๋ฒ ๋ ์ ํ
}
๊ทธ๋ฆฌ๊ณ ์ด์ while ๋ฌธ์ Q๊ฐ ๋น์ด์์ง ์์ ๋ ๊น์ง ๋๋ฉด์ ์ก์์ง์ ์์น๋ฅผ ์ฐพ์ ๋์๋ฉด ๋๋ค.
๋จผ์ Q์ size๋ฅผ len ๋ณ์๋ก ์ ์ธํด์ for๋ฌธ์ Q์ ๊ฐ์๋งํผ ๋๋ฆฌ๋ฉด์ Q์์ pollํ cur ์ขํ์ -1, 1, 5 ๋ฅผ ๊ฐ๊ฐ ๋ํด ์์ ๋ ธ๋๋ฅผ ๋ง๋ค์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ์์ ๋ ธ๋(์ขํ)๋ 1๋ถํฐ ์์์ด๋ฏ๋ก cur + jump[i]๊ฐ 0๋ณด๋ค ์ปค์ผ ํ๊ณ , ๋ง์ฝ ์ด๊ฒ e์ ๊ฐ์ผ๋ฉด ๋ฐ๋ก L๋ฅผ ๋ฆฌํดํด์ฃผ๋ฉด ๋๊ณ , e ์ก์์ง ์์น์๋ ๋ค๋ฅธ๋ฐ ch[cur + jump[i]] ๊ฐ 0์ด๋ผ๋ฉด ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋(์ขํ)์ด๋ฏ๋ก Q์ offer ํด์ฃผ๊ณ , ๋ฐฐ์ด์ ๊ฐ์ 1๋ก ๋ณ๊ฒฝํด์ค๋ค. (๊ทธ๋ผ ๋ค์์ Q์ offer ํ์ง ์์ ์ ์๋ค. ๊ตณ์ด ๋ฐฉ๋ฌธํ์ ๋ ์๋์๋ ๋ ธ๋๋ฅผ ๋ Q์ offer ํ ํ์๋ ์๋ค. ์๊ฐ ๋ณต์ก๋๋ง ๋์ด๋๋ค!)
Q์ size๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋ชจ๋ ๋๊ณ ๋๋ฉด ํด๋น ๋ ๋ฒจ์ ๋ ธ๋ (์ขํ)๋ ๋ชจ๋ ํ๋ฒ ์ฉ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ์ด์ ๋ค์ ๋ ๋ฒจ๋ก ๋์ด๊ฐ์ผ ํ๋ค. (ํ๋ฒ ๋ ์ ํ)
์ด๋ฐ์์ผ๋ก ํด์ฃผ๋ฉด ์ต์ ์ ํ ํ์๋ฅผ ๊ตฌํ ์ ์๋ค.
๋ฌธ์ ํ์ด 2
public class FindTheCalf2
{
int[] dis = { 1, -1, 5 };
int[] ch; // ํ๋ฒ ๋ฐฉ๋ฌธํ ๊ฒ์ Q์ ๋ฃ์ง ์๊ธฐ ์ํด์
Queue<Integer> Q = new LinkedList<>();
public int BFS(int s, int e)
{
ch = new int[10001];
ch[s] = 1;
Q.offer(s);
int L = 0; // root node level
while (!Q.isEmpty())
{
int len = Q.size(); // level์ ์๋ ์์์ ๊ฐ์
for (int i = 0; i < len; i++)
{
int x = Q.poll();
for (int j = 0; j < dis.length; j++)
{
int nx = x + dis[j]; // ์์ ๋
ธ๋
if (nx == e) return L + 1; // ํ์ฌ L์ ๋ถ๋ชจ ๋
ธ๋์ ๋ ๋ฒจ์ด๋ฏ๋ก nx์ ๋ ๋ฒจ๋ก ํด์ฃผ๊ธฐ ์ํด +1 ๋ฅผ ํด์ค๋ค.
if (nx >= 1 && nx <= 10000 && ch[nx] == 0) { // ๋ฐฉ๋ฌธ x
ch[nx] = 1;
Q.offer(nx);
}
}
}
L++;
}
return L;
}
public static void main(String[] args)
{
FindTheCalf2 findTheCalf2 = new FindTheCalf2();
Scanner scanner = new Scanner(System.in);
int s = scanner.nextInt(); // ํ์์ ์์น
int e = scanner.nextInt(); // ์ก์์ง์ ์์น
int result = findTheCalf2.BFS(s, e);
System.out.println(result);
}
}
๐พ : ๋ฌธ์ ํ์ด2๋ ๊ฐ์ฌ๋ ๋ฌธ์ ํ์ด์ด๋ค.
int[] dis = { 1, -1, 5 };
int[] ch; // ํ๋ฒ ๋ฐฉ๋ฌธํ ๊ฒ์ Q์ ๋ฃ์ง ์๊ธฐ ์ํด์
Queue<Integer> Q = new LinkedList<>();
๊ฐ์ฌ๋๋ ๋์ ๊ฐ์ด dis ๋ฐฐ์ด์ -1, 1, 5 ์ ํ ํ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์๋๊ณ , ํ๋ฒ ๋ฐฉ๋ฌธํ ๊ฒ์ Q์ offer ํ์ง ์๊ธฐ ์ํด์ ch ๋ฐฐ์ด์ ์ ์ธํด์คฌ๋ค.
public int BFS(int s, int e)
{
ch = new int[10001];
ch[s] = 1;
Q.offer(s);
int L = 0; // root node level
while (!Q.isEmpty())
{
int len = Q.size(); // level์ ์๋ ์์์ ๊ฐ์
for (int i = 0; i < len; i++)
{
int x = Q.poll();
for (int j = 0; j < dis.length; j++)
{
int nx = x + dis[j]; // ์์ ๋
ธ๋
if (nx == e) return L + 1; // ํ์ฌ L์ ๋ถ๋ชจ ๋
ธ๋์ ๋ ๋ฒจ์ด๋ฏ๋ก nx์ ๋ ๋ฒจ๋ก ํด์ฃผ๊ธฐ ์ํด +1 ๋ฅผ ํด์ค๋ค.
if (nx >= 1 && nx <= 10000 && ch[nx] == 0) { // ๋ฐฉ๋ฌธ x
ch[nx] = 1;
Q.offer(nx);
}
}
}
L++;
}
return L;
}
ํ์คํ ๊ฐ์ฌ๋ ์ฝ๋๊ฐ ๋ ๊น๋ํ๊ตฌ๋... ๋ด ์ฝ๋๋ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ฏ... ์ค๋ณต์ฝ๋๊ฐ ๊ฝค ๋ง๋ค.
ch = new int[10001];
ch[s] = 1;
Q.offer(s);
int L = 0; // root node level
๋จผ์ ch๋ ์ขํ๊ฐ 10000๊น์ง ๊ฐ๋ฅํ๋ค๊ณ ํ๋๊น 10000์ ์ธ๋ฑ์ค 0์ ์์ธ๊ฑฐ๋๊น + 1 ๋ฅผ ํด์ 10001 ๋ก ํฌ๊ธฐ๋ฅผ ์ด๊ธฐํํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ch[s]๋ ํ์์ ์์น์ด๋ฏ๋ก ํ์์ ์์น๋ฅผ 1๋ก ์ ์ธํด์ฃผ๊ณ , ๊ทธ ๋ค์ Q์ ํ์์ ์์น s๋ฅผ ๋จผ์ offer ํด์ค๋ค.
๊ทธ๋ ๊ฒ ํด์ ํ์์ ์์น๋ฅผ ๋ฃจํธ ๋ ธ๋๋ก ์ค์ ํด์ ์ด์ ๊ฑฐ๊ธฐ์๋ถํฐ ์์ ๋ ธ๋๋ฅผ ๋ง๋ค์ด๊ฐ๋ฉฐ ๋ฐ์ผ๋ก ์ญ์ญ ๋ด๋ ค๊ฐ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฌ๋์ L์ root node์ ๋ ๋ฒจ์ธ 0์ผ๋ก ์ค์ ํด์คฌ๋ค.
while (!Q.isEmpty())
{
int len = Q.size(); // level์ ์๋ ์์์ ๊ฐ์
for (int i = 0; i < len; i++)
{
int x = Q.poll();
for (int j = 0; j < dis.length; j++)
{
int nx = x + dis[j]; // ์์ ๋
ธ๋
if (nx == e) return L + 1; // ํ์ฌ L์ ๋ถ๋ชจ ๋
ธ๋์ ๋ ๋ฒจ์ด๋ฏ๋ก nx์ ๋ ๋ฒจ๋ก ํด์ฃผ๊ธฐ ์ํด +1 ๋ฅผ ํด์ค๋ค.
if (nx >= 1 && nx <= 10000 && ch[nx] == 0) { // ๋ฐฉ๋ฌธ x
ch[nx] = 1;
Q.offer(nx);
}
}
}
L++;
}
์ด์ while๋ฌธ์ Q๊ฐ ๋น์ด์์ง ์์ ๋๊น์ง ๋ฐ๋ณตํด์ ์คํํด์ฃผ๋ฉด ๋๋๋ฐ
๋จผ์ Q์ size๋ฅผ ๊ตฌํ๊ณ ์ด ํฌ๊ธฐ๋งํผ for๋ฌธ์ ๋๋ฆฐ๋ค. (ํด๋น ๋ ๋ฒจ์ ๋ค์ด์๋ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.)
๋จผ์ Q์์ ํ๋๋ฅผ poll ํด์ ์ด๋ฅผ x๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ dis ํฌ๊ธฐ๋งํผ for๋ฌธ์ ๋๋ฉด์ x์ -1, 1, 5 ๊ฐ์ ๋ํด์ฃผ๋๋ฐ (์ด๊ฒ ์์ ๋ ธ๋๊ฐ ๋๋ค.)
์ด ์์ ๋ ธ๋๊ฐ ๋ง์ฝ ์ก์์ง์ ์์น๋ค! ํ๋ฉด ํ์ฌ L์ ๋ถ๋ชจ ๋ ธ๋์ ๋ ๋ฒจ์ ํด๋นํ๋ฏ๋ก ๋ฆฌํดํ ๋๋ ์์ ๋ ธ๋์ ๋ ๋ฒจ๋ก ํด์ฃผ๊ธฐ ์ํด return L + 1 ๋ฅผ ํด์ฃผ๊ณ ๋๋๋ค.
์์ ๋ ธ๋๋ ์ขํ๊ฐ 1๋ถํฐ 10000์ฌ์ด ์ด๋ฏ๋ก ์ด ๋ฒ์ ์์ ํด๋นํด์ผํ๊ณ (์์ ์๋จ), ๊ทธ๋ฆฌ๊ณ ์์ ๋ ธ๋ ์ธ๋ฑ์ค์ ch ๋ฐฐ์ด์์ ๋ฐฉ๋ฌธํ์ง ์์ ch[nx] == 0 ์ด๋ผ๋ฉด ch[nx] ์ 1๋ก ์ค์ ํด์ฃผ๊ณ , Q์ nx ๊ฐ์ offer ํด์ค๋ค. (๋ค์ ๋ ๋ฒจ์ ๋ ธ๋๋ก ์ ํด์ค)
์ด๋ ๊ฒ ๋ฐ๋ณตํ๋ฉด์ ์ญ์ญ ๋ด๋ ค๊ฐ๋ฉด ๋๋ค.