[TIL #24] 24์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.26 ์ผ)
2023. 3. 26. 23:01ใToday I Learned
TIL 2023.03.26 ๐ฃ
์ค๋ ๋ฐฐ์ด ๊ฒ ๐ฉ๐ป๐ป
์๊ณ ๋ฆฌ์ฆ
- ๋ฐฑ์ค 6064 ์นด์ ๋ฌ๋ ฅ : ๊ฒจ์ฐ ์ดํดํ๋ค. ๊ทธ๋์ ๋ธ๋ก๊ทธ๋ก ์ ๋ฆฌํ๋ค. ๊ธ์ด ์ ์ฝํ๋๋ก ์ฐ๋ ๊ฑด ์ ๋ง ์ด๋ ต๋ค๋ ๊ฒ์ ์์ผ ๋ ๋๊ผ๋ค. ํด ๐ฎ๐จ
- ๋ฐฑ์ค 1780 ์ข
์ด์ ๊ฐฏ์
- ์คํจ ์์ค
# ์ข ์ด์ ๊ฐฏ์ import sys n = int(sys.stdin.readline().rstrip()) paper = [] for _ in range(n): paper.append(list(sys.stdin.readline().rstrip().split())) cnt = {'-1':0, '0':0, '1':0} def cutPaper(x, y, n): if n == 1: cnt[paper[x][y]] += 1 return # ๋ชจ๋ ๊ฐ์ ์์ธ์ง ํ์ธ paperNum = paper[x][y] for i in range(x, x + n): for j in range(y, y + n): if paper[i][j] != paperNum: paperNum = paper[i][j] break # 9๊ฐ๋ก ์๋ฅผ์ง ์ฌ๋ถ ํ์ธ if paperNum == paper[x][y]: cnt[paperNum] += 1 return # 9๊ฐ๋ก ์๋ฅด๊ธฐ : paperNum ๊ฐ์ด ๋ฐ๊ผ๋ค๋ฉด ์ข ์ด๊ฐ ๊ฐ์ ์๊ฐ ์๋ paperSize = n // 3 for i in range(0, 3): for j in range(0, 3): cutPaper(x + (i * paperSize), y + (j * paperSize), paperSize) cutPaper(0, 0, n) # ๊ฒฐ๊ณผ ์ถ๋ ฅ print(cnt['-1']) print(cnt['0']) print(cnt['1'])
- ๋ค๋ฅธ ์ฝ๋ ์ฐธ๊ณ ํ์ง ์๊ณ ํ๋ฃจ๋ฃฉ ์ง ์ฝ๋๋ผ ๋๊ฒ ๋ฟ๋ฏํดํ๋ฉด์ ์ ์ถํ๋๋ฐ ๋ฐ๋ก ํ๋ ธ์ต๋๋ค! ๐
- ์ด์ค for๋ฌธ์ผ๋ก paper ๋ฒ์ ๋ด์ ๋ค๋ฅธ ์ซ์๊ฐ ์๋ ๊ฒฝ์ฐ
paperNum
์paper[i][j]
๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค. ์ด์ค for๋ฌธ์ด ๋๋ ๋คpaperNum
๊ฐ์ด ์ด๊ธฐ๊ฐ์ด์๋paper[x][y]
์ ๋ค๋ฅด๋ค๋ฉด ๋ฒ์ ๋ด์ ๋ค๋ฅธ ์ซ์๊ฐ ์๋ค๋ ๊ฒ์ผ๋ก ํ๋จํ์ฌ 9๊ฐ๋ก ์ข ์ด๋ฅผ ์๋ฅด๋๋ก ํ์๋ค. ๐ ์ด๊ฒ ๋ฐ๋ก ์คํจ์์ธ! - ์ด์ค for๋ฌธ์ break ํ ๋, ๋ด๋ถ์ ์๋
j
๊ฐ for๋ฌธ๋งbreak
๋๊ณ ์ธ๋ถ์ for๋ฌธ์break
๋์ง ์๋๋ค. ๋ฐ๋ผ์paperNum
์ ๊ฐ์paper[x][y]
์ ๋์ผํ ๊ฐ์ผ๋ก ๋ฐ๊พธ๊ฒ ๋๋ค๋ฉด, ๋ฒ์๋ด์ ๋ค๋ฅธ ๊ฐ์ ๊ฐ์งํ์ง ๋ชปํ๊ฒ ๋๋ค. - ๋ฐ๋ผ์
cutFlag
๋ฅผ ์ฌ์ฉํด์ ์ด์ค for๋ฌธ ์ ์ฒด๊ฐbreak
๋๋๋ก ์์ ํ๋ค. - ์ต์ข
์์ค
# ์ข ์ด์ ๊ฐฏ์ import sys n = int(sys.stdin.readline().rstrip()) paper = [] for _ in range(n): paper.append(list(sys.stdin.readline().rstrip().split())) cnt = {'-1':0, '0':0, '1':0} def cutPaper(x, y, n): if n == 1: cnt[paper[x][y]] += 1 return # ๋ชจ๋ ๊ฐ์ ์์ธ์ง ํ์ธ paperNum = paper[x][y] cutFlag = False for i in range(x, x + n): for j in range(y, y + n): if paper[i][j] != paperNum: cutFlag = True # ๋ค๋ฅธ ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ข ์ด ์๋ฅด๊ธฐ break if cutFlag: break if not cutFlag: cnt[paperNum] += 1 # ํด๋น ์ซ์์ ์ข ์ด ์ ์ฆ๊ฐ return # 9๊ฐ๋ก ์๋ฅด๊ธฐ : cutFlag๊ฐ ๋ฐ๊ผ๋ค๋ฉด ์ข ์ด๊ฐ ๊ฐ์ ์๊ฐ ์๋ paperSize = n // 3 for i in range(0, 3): for j in range(0, 3): cutPaper(x + (i * paperSize), y + (j * paperSize), paperSize) cutPaper(0, 0, n) # ๊ฒฐ๊ณผ ์ถ๋ ฅ print(cnt['-1']) print(cnt['0']) print(cnt['1'])
- ์คํจ ์์ค
- ๋ฐฑ์ค 1992 ์ฟผ๋ ํธ๋ฆฌ : 1780๋ฒ ๋ฌธ์ ์ ๋น์ทํ ๋ฌธ์
- [์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋] 4๊ฐ์ ์์ญ์ผ๋ก ๋๋๋ฉฐ, 0 ๋๋ 1๋ก ์์ถ๋ ์ ์๋ค.
- ๊ดํธ () ์ถ๋ ฅ์ผ๋ก ๊ตฌ๋ถ์ด ํ์ํ๋ค. ๐ ์ฌ๊ท ํธ์ถ ์ ์ ๊ดํธ๋ก ๋ด์ฉ์ ๊ฐ์ธ๋๋ก ์ถ๋ ฅํด์คฌ๋ค.
-
# ์ฟผ๋ ํธ๋ฆฌ import sys n = int(sys.stdin.readline().rstrip()) video = [] for _ in range(n): video.append(list(sys.stdin.readline().rstrip())) def divideVideo(x, y, n): if n == 1: print(video[x][y], end='') return # ๋ชจ๋ ๊ฐ์ ์์ธ์ง ํ์ธ divideFlag = False for i in range(x, x + n): for j in range(y, y + n): if video[i][j] != video[x][y]: divideFlag = True # ๋ค๋ฅธ ์ ์ฒดํฌ break if divideFlag: break if not divideFlag: print(video[x][y], end='') # video[x][y]๋ก ์์ถ return # 4๊ฐ ์์ญ : ์ผ์ชฝ ์, ์ค๋ฅธ์ชฝ ์, ์ผ์ชฝ ์๋, ์ค๋ฅธ์ชฝ ์๋ size = n // 2 print("(", end='') divideVideo(x, y, size) divideVideo(x, y + size, size) divideVideo(x + size, y, size) divideVideo(x + size, y + size, size) print(")", end='') divideVideo(0, 0, n)
- ๋ฐฑ์ค 11403 : ํ๋ฃจ์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ ํ์ฉ ๋ฌธ์
- ๋ฐฑ์ค 7569 ํ ๋งํ : 7576๋ฒ ๋ฌธ์ ์ ๋น์ทํ ๋ฌธ์ , ๋๊ฐ์ ํ ๋งํ ๋ฌธ์ ์ธ๋ฐ ์์์ ๋์ด(h)๊ฐ ์ถ๊ฐ๋๋ฉฐ, ์ ๋ค์ ์์์๋ ์ํฅ์ ๋ฏธ์น๋ค.
- ๋ฐ๋ผ์ ์๊ณผ ๋ค์ ์์์๋ ์ํฅ์ ์ฃผ๊ธฐ ์ํด ๋ฐฉํฅ ๋๊ฐ (-n, 0), (n, 0) ์ ์ถ๊ฐํ๊ณ , ์ํ์ข์ฐ ์ฒดํฌํ ๋ ๊ฐ์ ์ธต์ธ์ง ํ์ธํ๋๋ก ์ถ๊ฐํ๋ค.
-
# ํ ๋งํ 2 import sys from collections import deque def bfs(n, h, pos): dirs = [(-1, 0, True), (1, 0, True), (0, -1, True), (0, 1, True), (-n, 0, False), (n, 0, False)] # ์, ์๋, ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, queue = deque(pos) answer = 0 while queue : x, y, date = queue.popleft() for dx, dy, sameBox in dirs: nx = x + dx ny = y + dy if nx < 0 or nx >= (n * h) or ny < 0 or ny >= m: continue start = (x // n) * n # ์ธต ์์ ๋ฒ์ if sameBox and (nx < start or nx >= start + n): # ์ํ์ข์ฐ๊ฐ ๊ฐ์ ์ธต์ด ์๋ ๊ฒฝ์ฐ continue if tomato[nx][ny] == -1: continue if tomato[nx][ny] == 0: tomato[nx][ny] = date + 1 queue.append((nx, ny, tomato[nx][ny])) answer = max(date, answer) for t in tomato: if 0 in t: return -1 return date m, n, h= map(int, sys.stdin.readline().rstrip().split()) tomato = [] for _ in range(n * h): tomato.append(list(map(int, sys.stdin.readline().rstrip().split()))) pos = [] # ์ต์ ํ ๋งํ ์ขํ for i in range(n * h): for j in range(m): if tomato[i][j] == 1: pos.append((i, j, 0)) print(bfs(n, h, pos))
ํด๋ฆฐ์ฝ๋
- ํด๋ฆฐ์ฝ๋ ์ด์ ๋ ํ์ด์ฌ์ด๋ค 8์ฅ_ํ์ด์ฌ์์ ๋น ์ง๊ธฐ ์ฌ์ด ํจ์ ๋ค
์ถ๊ฐ์ ์ผ๋ก ํ๋ฉด ์ข์ ๊ฒ
๊ธฐํ ๐ค
์ค๋์ ์ค๋๋ง์ ์๊ณ ๋ฆฌ์ฆ์ ์ค์ ์ผ๋ก ๊ณต๋ถํ๋ค. ์ฌ๋ฐ๋ค. 3์ ์์ ๋ฐฑ์ค ๊ณจ๋ 3์ ๋ฌ์ฑํ ์ ์์ ๊ฒ ๊ฐ๋ค. ๋๊ทผ!
'Today I Learned' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL #26] 26์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.28 ํ) (0) | 2023.04.01 |
---|---|
[TIL #25] 25์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.27 ์) (0) | 2023.03.28 |
[TIL #23] 23์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.25 ํ ) (0) | 2023.03.26 |
[TIL #22] 22์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.21 ํ) (0) | 2023.03.21 |
[TIL #21] 21์ผ์ฐจ ์ค๋์ ๊ณต๋ถ (2023.03.20 ์) (0) | 2023.03.21 |