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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])
, '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
71 changes: 71 additions & 0 deletions BOJ/문자열 지옥에 빠진 호석/wooyeol.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
"""
문자열 지옥에 빠진 호석
https://www.acmicpc.net/problem/20166

풀이시간
12:42 ~ (문제 풀이 실패)

문제 조건
3 <= N,M <= 10
1 <= K <= 1,000
1 <= 신이 좋아하는 문자열 <= 5

시간 복잡도 :
O(N * M * 8^5 + K)
O(3,277,800)

접근법
무슨 알고리즘으로 풀이 할 수 있을까? -> BFS 탐색

1. 만들어질 수 있는 모든 문자열을 탐색하여 해시테이블에 등록
2. 등록된 해시 테이블의 값에서 입력받은 문자열의 값을 반환
"""
import sys
from collections import deque
from collections import defaultdict

input = sys.stdin.readline

# 상, 하, 좌, 우, 대각선 왼쪽 위, 대각선 오른쪽 위, 대각선 왼쪽 아래, 대각선 오른쪽 아래
directions = ((-1,0),(1,0),(0,-1),(0,1),(-1,-1),(-1,1),(1,-1),(1,1))

def bfs(x, y):

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.

저는 DFS로 풀이했는데, 우열님께서 BFS로 깔끔하게 풀이해주신것 같아요~!! 고생하셨습니다 :)

queue = deque()
queue.append([x, y, table[x][y]])

while queue:
x, y, text = queue.popleft()

# 지금까지 확인된 문자열의 갯수 증가
answer_dict[text] += 1

# 문자열의 길이가 5 이상이라면 더 이상 검색하지 않는다.
if len(text) >= 5:

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.

큐에 삽입할 때(52번 라인) 이 조건문을 추가해주면 연산 횟수도 줄고 조금 더 깔끔해지지 않을까 싶습니다!

continue

# BFS 탐색
for dx, dy in directions:
# nx,ny의 환형 구조를 반영
nx, ny = (x + dx) % N, (y + dy) % M

# 다음 탐색할 노드 추가
queue.append((nx, ny, text + table[nx][ny]))

N, M, K = map(int, input().split())

# N by M 의 격자
table = []

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.

별 다른 추가 연산이 없기 때문에 57 ~ 59번 라인을 table = [input().rstrip() for _ in range(N)] 으로 가능! 파이써닉하게 가봅시다

for _ in range(N):
table.append(input().rstrip())

# 격자에서 가능한 모든 문자열 갯수 탐색
answer_dict = defaultdict(int)
for row_i, row in enumerate(table):
for col_i, col in enumerate(row):
bfs(row_i, col_i)

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.

우열님 이부분은 range(len()) 을 사용하셔도 괜찮을 것 같습니다!!
제 로컬 IDE 에서 돌려보니 약 1.75 배정도 속도차이가 나네요!

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.

도현님이 코멘트 남겨주신 것처럼, 위에서 table의 크기인 N과 M 주어지기 때문에

for row_i in range(N):
for col_i in range(M):
bfs(row_i, col_i)

로 쓰시면 더 깔끔하고 빠를것 같아요~!!!


# 입력받은 문자열의 갯수 출력
for _ in range(K):
# 입력 받은 신이 좋아하는 문자열
target_string = input().rstrip()
print(answer_dict[target_string])