This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions BOJ/불!/dohyun.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
"""

풀이시간
- 약 7시간 (공부하면서 같이 풀었습니다!!)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저와 같은 시간이시군요! 도현님!! 계속 도전해보다보면 저희도 점점 시간이 줄 수 있을 거에요!! 화이팅입니다!


접근법
- 불의 좌표를 구해서 행렬 값을 번지는 불로 바꿔볼까? -> 시간복잡도 걸릴 것 같음
- 불의 좌표 구하고 행렬 값을 바꾸지말고 불 인덱스를 추가하자 -> 불에 닿으면 IMPOSSIBLE
- 그리고 불이나 벽이나 글로 못가는건 똑같음 -> 벽 인덱스도 추가
- 문제에서 보면 "불이 도달하기 전에" -> "불이 도착점에 도달하기 전에"
- 지훈이의 탈출 지점에 불이 더 빨리 도착하냐? 지훈이가 더 빨리 도착하냐? 를 계산하면 될것같음
- 계속 보다보니 예전에 잠깐 봤던 BFS 가 생각나서 BFS 알고리즘 코드는 인터넷에서 배꼈습니당 .. ㅎ
- 혼자 BFS 를 짜다보니 도저히 감도 안오고 시간도 오래걸리고, 외우다시피 익숙해지는게 좋다고 해서 우선은 배꼈습니다!! 앞으로 연습 많이 할게요!!

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님께서 추천해주신 BFS와 DFS 문제 추천드립니다~~ 우선 개념을 알고 외우다시피 익숙해지는거랑 그냥 외우는 거랑 효과가 다르다고 생각해서 개념도 먼저 보시는 걸 추천드려요!


회고
- 왜 틀렸다고 뜨는지 도저히 잘 모르겠어요 ,, ㅠㅠ 어디 때문에 안되는지 혹시 아시겠다면 말씀해주시면 정말 감사하겠습니다 !!!

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

혹시 틀린 코드가 아래 코드 인가요!??


"""

import sys
from collections import deque

n, m = map(int, sys.stdin.readline().split())

board = []
for _ in range(n):
ex = [x for x in sys.stdin.readline().rstrip()]
board.append(ex)

row_idx = 0

# 불과 지훈이의 초기점 찾기
for i in range(n):
for j in range(m):
element = board[i][j]
if element=='F':

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

불은 지훈이처럼 하나만 주어지는게 아니에요.
근데 여기서 불 위치 하나만 받고 있고, 도현님이 작성하신 예시도 다 불이 하나일 때만이어서 이렇게 코드를 작성하시면 당연히 틀릴 수 밖에 없겠죠??

Q)
5 5
#####
#####
..J..
F...F
.....
A)
3

반례 드립니당~
질문 게시판을 적극 활용해보세요!!

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

와~~ 불이 하나가 아닐 수도 있군요.... 몰랐습니다... ㅋㅋㅋㅋㅋ
감사합니다 수밍님!

fire_idx = (i, j)
elif element=='J':
jihoon_idx = (i, j)

# 상하좌우 네 방향을 의미
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def bfs(start_idx):
vis = [[-1] * m for _ in range(n)] # 해당 칸을 방문했는지 여부를 저장
Q = deque()
vis[start_idx[0]][start_idx[1]] = 0 # 시작점의 좌표를 방문했다고 명시
Q.append(start_idx) # 큐에 시작점인 좌표를 삽입.

escape = []
count = 0

while Q:
cur = Q.popleft()
# 걸린 시간 증가
count += 1
# print("cur:", cur, "value:", vis[cur[0]][cur[1]]) # 디버깅을 위함

for dir in range(4): # 상하좌우 탐색
nx = cur[0] + dx[dir]
ny = cur[1] + dy[dir]

# 정상적인 범위안에 들어왔을 경우
if 0 <= nx < n and 0 <= ny < m:
# 이미 방문한 칸이 아니거나 벽, 불이 아닌 경우
if (vis[nx][ny]==-1) & (board[nx][ny]!="#") & (board[nx][ny]!="F"):
vis[nx][ny] = count # (nx, ny) 에 걸린 시간을 입력
Q.append((nx, ny))

# 정상적인 범위를 넘어감 -> 즉 탈출에 성공!
else:
# 탈출 직전의 좌표를 받음
escape.append(cur)

return vis, escape

fire_visit, fire_escape = bfs(fire_idx)
jihoon_visit, jihoon_escape = bfs(jihoon_idx)

answer = []

# 지훈이가 도착점까지 걸린시간보다 불이 더 늦게 도착했는지 확인
for escape_point in jihoon_escape:
x, y = escape_point[0], escape_point[1]
if (jihoon_visit[x][y] < fire_visit[x][y]) or (fire_visit[x][y]==-1):
answer.append(jihoon_visit[x][y] + 1)


if answer:
print(min(answer))

else:
print("IMPOSSIBLE")


"""
### ex -> 3
4 4
####
#JF#
#..#
#..#
"""

"""
### ex1 -> 1
3 2
##
#J
#F
"""

"""
### ex2 -> 3
4 4
F###
#J##
#...
#.##
"""

"""
### ex3 -> 2
4 4
#.##
#.F#
#J##
#.##
"""