๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Implementation Algorithm)

sssbin 2022. 1. 26. 16:50

๊ตฌํ˜„

'๋จธ๋ฆฟ์†์— ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†Œ์Šค์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •' 

   -> ๋ชจ๋“  ๋ฒ”์œ„์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…

   -> ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ๋ฒ• ์ˆ™์ง€, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ๊ฒฝํ—˜์„ ๋Š˜๋ ค์•ผ ํ•จ.

· ์™„์ „ ํƒ์ƒ‰: ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ฃผ์ € ์—†์ด ๋‹ค ๊ณ„์‚ฐํ•˜๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

· ์‹œ๋ฎฌ๋ ˆ์ด์…˜: ๋ฌธ์ œ์—์„œ ์ œ์‹œํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•œ ๋‹จ๊ณ„์”ฉ ์ฐจ๋ก€๋Œ€๋กœ ์ง์ ‘ ์ˆ˜ํ–‰

 

 

๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ์‚ฌํ•ญ

- C/C++์—์„œ ๋ณ€์ˆ˜์˜ ํ‘œํ˜„ ๋ฒ”์œ„

   (int 4๋ฐ”์ดํŠธ, long 8๋ฐ”์ดํŠธ -> ํŒŒ์ด์ฌ X, ์ž๋ฐ” BigInteger, C++ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•„์š”)

- ํŒŒ์ด์ฌ์—์„œ ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ

    (๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ 1000 -> ๋ฉ”๋ชจ๋ฆฌ 4KB / ๋ฐฑ๋งŒ -> 4MB / ์ฒœ๋งŒ -> 40MB)

 

 

์ฑ„์  ํ™˜๊ฒฝ

- ํŒŒ์ด์ฌ์€ C/C++์— ๋น„ํ•ด ๋™์ž‘ ์†๋„ ๋А๋ฆผ. 1์ดˆ์— 2,000๋งŒ ๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ํฌ๊ฒŒ ๋ฌด๋ฆฌ ์—†์Œ.

- ์‹œ๊ฐ„ ์ œํ•œ 1์ดˆ, ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ 100๋งŒ ๊ฐœ -> O(NlogN)

- ์ด์ฒ˜๋Ÿผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ์‹œ๊ฐ„ ์ œํ•œ๊ณผ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋จผ์ € ํ™•์ธํ•œ ํ›„ ์–ด๋А ์ •๋„ ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ์ž‘์„ฑํ• ์ง€ ์˜ˆ์ธก

 

 

๊ตฌํ˜„ ๋ฌธ์ œ์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•

- ๋ณดํ†ต ๊ตฌํ˜„ ์œ ํ˜•์˜ ๋ฌธ์ œ๋Š” ์‚ฌ์†Œํ•œ ์ž…๋ ฅ ์กฐ๊ฑด ๋“ฑ์„ ๋ฌธ์ œ์—์„œ ๋ช…์‹œํ•ด์ฃผ๋ฉฐ ๋ฌธ์ œ์˜ ๊ธธ์ด๊ฐ€ ๊ฝค ๊ธด ํŽธ์ž„.

- ํŒŒ์ด์ฌ์€ ๊ตฌํ˜„ ๋‚œ์ด๋„๋Š” ์‰ฌ์šด ํŽธ์ด์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ธด ํŽธ. (↔ C/C++)

- Pypy3๋Š” ํŒŒ์ด์ฌ3์˜ ๋ฌธ๋ฒ• ์ง€์›, ์‹คํ–‰์†๋„ ๋น ๋ฆ„.

- API ๊ฐœ๋ฐœ ๋ฌธ์ œ (+ ์›น ์„œ๋ฒ„, ๋ฐ์ดํ„ฐ ๋ถ„์„์— ๋Œ€ํ•œ ์ง€์‹)

 

 

์˜ˆ์ œ1. ์ƒํ•˜์ขŒ์šฐ 

- ๋‚ด ์ฝ”๋“œ: L, R, U, D ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•ด์„œ ์—ฐ์‚ฐํ•จ.

n = int(input())
move = list(input().split())

x = 1
y = 1

for i in move:
    if i == 'L':
        if y != 1:
            y -= 1
    elif i == 'R':
        if y != n:
            y += 1
    elif i == 'U':
        if x != 1:
            x -= 1
    else:
        if x != n:
            x += 1

print(x, y)

 

- ๊ต์žฌ ์ฝ”๋“œ: ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ L, R, U, D ๋น„๊ตํ•ด์„œ ์—ฐ์‚ฐ ์ˆ˜ํ–‰. ๊ธฐ์กด ๊ฐ’ + ์ˆ˜์ •๊ฐ’

n = int(input())
x, y = 1, 1
plans = input().split()

# L, R, U, D์— ๋”ฐ๋ฅธ ์ด๋™ ๋ฐฉํ–ฅ
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
move_types = ['L', 'R', 'U', 'D']

# ์ด๋™ ๊ณ„ํš์„ ํ•˜๋‚˜์”ฉ ํ™•์ธ
for plan in plans:
    # ์ด๋™ ํ›„ ์ขŒํ‘œ ๊ตฌํ•˜๊ธฐ
    for i in range(len(move_types)):
        if plan == move_types[i]:
            nx = x + dx[i]
            ny = y + dy[i]
    # ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ
    if nx < 1 or ny < 1 or nx > n or ny > n:
        continue
    # ์ด๋™ ์ˆ˜ํ–‰
    x, y = nx, ny

print(x, y)

 

 

์˜ˆ์ œ2. ์‹œ๊ฐ

- ๋‚ด ์ฝ”๋“œ: ์ „์ฒด ์‹œ๊ฐ - 3์ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์‹œ๊ฐ (์ˆซ์ž์—ฐ์‚ฐ)

n = int(input())
a = (n+1) * 6 * 10 * 6 * 10

if n >= 3:
    b = n * 5 * 9 * 5 * 9
else:
    b = (n+1) * 5 * 9 * 5 * 9
    
print(a-b)

 

- ๊ต์žฌ ์ฝ”๋“œ: ๋ชจ๋“  ์‹œ๊ฐ์˜ ๊ฒฝ์šฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ชจ๋‘ ์…ˆ. ๋‹จ์ˆœํžˆ ์‹œ๊ฐ์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ 3์ด ํ•˜๋‚˜๋ผ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ -> ์™„์ „ํƒ์ƒ‰

                   ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” 86,400๊ฐ€์ง€๋ฐ–์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ œํ•œ ์‹œ๊ฐ„ ์•ˆ์— ๋ฌธ์ œ ํ’€ ์ˆ˜ ์žˆ์Œ.

h = int(input())

count = 0
for i in range(h+1):
    for j in range(60):
        for k in range(60):
            # ๋งค ์‹œ๊ฐ ์•ˆ์— '3'์ด ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ์นด์šดํŠธ ์ฆ๊ฐ€
            if '3' in str(i) + str(j) + str(k):
                count += 1

print(count)

 

 

์˜ˆ์ œ3. ์™•์‹ค์˜ ๋‚˜์ดํŠธ

- ๋‚ด ์ฝ”๋“œ: ์ตœ๋Œ€ ์ด๋™ ํšŸ์ˆ˜ 8, ์ด๋™ ๋ฐฐ์—ด ์ •์˜ -> ๊ฐ๊ฐ x, y๊ฐ’์— ๋”ํ•œ ํ›„ ์ฃผ์–ด์ง„ ์ขŒํ‘œ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ด๋™ ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ด

p = input()
x = int(p[1])
y = int(ord(p[0]) - ord('a')) + 1

move = [(-2, 1), (-2, -1), (2, 1), (2, -1), (1, -2), (1, 2), (-1, -2), (-1, 2)]
count = 8

for i, j in move:
    mx = x - i
    my = y - j

    if mx < 1 or my < 1 or mx > 8 or my > 8:
        count -= 1

print(count)

์ฒ˜์Œ์—” ์›๋ž˜ ๊ฐ๊ฐ ๋‚จ์€ ์นธ์˜ ๋ณ€์ˆ˜ L, R, U, D๋ฅผ ์ •์˜ํ•ด์„œ if๋ฌธ ๋Œ๋ ค์„œ ํ’€๋ ค๊ณ  ํ–ˆ์œผ๋‚˜,,

์Šค์ผ€์น˜ ํ•œ ํ›„ ๋ง‰์ƒ ์ฝ”๋“œ ์งœ๋ ค๋‹ค ๋ณด๋‹ˆ ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ์ง€์ €๋ถ„ํ•ด์ง€๊ณ  ๋น„ํšจ์œจ์ ์ด์–ด์„œ ๋‹ค์‹œ ๋ฐ”๊ฟˆ

 

- ๊ต์žฌ ์ฝ”๋“œ: ์ด๋™ ๋ฐฐ์—ด ์ •์˜ ํ›„ ๊ฐ ์œ„์น˜๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ

input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1

# ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” 8๊ฐ€์ง€ ๋ฐฉํ–ฅ ์ •์˜
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]

# 8๊ฐ€์ง€ ๋ฐฉํ–ฅ์— ๋Œ€ํ•˜์—ฌ ๊ฐ ์œ„์น˜๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
result = 0
for step in steps:
    # ์ด๋™ํ•˜๊ณ ์ž ํ•˜๋Š” ์œ„์น˜ ํ™•์ธ
    next_row = row + step[0]
    next_column = column + step[1]
    # ํ•ด๋‹น ์œ„์น˜๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์นด์šดํŠธ ์ฆ๊ฐ€
    if next_row >= 1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
        result += 1

print(result)

๋‚ด๊ฐ€ ํ‘ผ ์ฝ”๋“œ๋ž‘ ๋น„์Šทํ•˜๋‹ค. ๋‚˜๋Š” ๋Œ์•„๊ฐ€๋ฉด์„œ ์นด์šดํŠธ๋ฅผ ๊ฐ์†Œ์‹œ์ผฐ๊ณ  ๊ต์žฌ๋Š” ๋Œ์•„๊ฐ€๋ฉด์„œ ์นด์šดํŠธ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด.

 

 

์˜ˆ์ œ4. ๊ฒŒ์ž„ ๊ฐœ๋ฐœ

# N, M์„ ๊ณต๋ฐฑ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())

# ๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งต์„ ์ƒ์„ฑํ•˜์—ฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
d = [[0] * m for _ in range(n)]
# ํ˜„์žฌ ์บ๋ฆญํ„ฐ์˜ X ์ขŒํ‘œ, Y ์ขŒํ‘œ, ๋ฐฉํ–ฅ์„ ์ž…๋ ฅ๋ฐ›๊ธฐ
x, y, direction = map(int, input().split())
d[x][y] = 1 # ํ˜„์žฌ ์ขŒํ‘œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

# ์ „์ฒด ๋งต ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
array = []
for i in range(n):
    array.append(list(map(int, input().split())))

# ๋ถ, ๋™, ๋‚จ, ์„œ ๋ฐฉํ–ฅ ์ •์˜
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

# ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „
def turn_left():
    global direction
    direction -= 1
    if direction == -1:
        direction = 3

# ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘
count = 1
turn_time = 0
while True:
    # ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    # ํšŒ์ „ํ•œ ์ดํ›„ ์ •๋ฉด์— ๊ฐ€๋ณด์ง€ ์•Š์€ ์นธ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋™
    if d[nx][ny] == 0 and array[nx][ny] == 0:
        d[nx][ny] = 1
        x = nx
        y = ny
        count += 1
        turn_time = 0
        continue
    # ํšŒ์ „ํ•œ ์ดํ›„ ์ •๋ฉด์— ๊ฐ€๋ณด์ง€ ์•Š์€ ์นธ์ด ์—†๊ฑฐ๋‚˜ ๋ฐ”๋‹ค์ธ ๊ฒฝ์šฐ
    else:
        turn_time += 1
    # ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ
    if turn_time == 4:
        nx = x - dx[direction]
        ny = y - dy[direction]
        # ๋’ค๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ด๋™ํ•˜๊ธฐ
        if array[nx][ny] == 0:
            x = nx
            y = ny
        # ๋’ค๊ฐ€ ๋ฐ”๋‹ค๋กœ ๋ง‰ํ˜€์žˆ๋Š” ๊ฒฝ์šฐ
        else:
            break
        turn_time = 0

# ์ •๋‹ต ์ถœ๋ ฅ
print(count)

 

- ์ „ํ˜•์ ์ธ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ -> ๋ณ„๋„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” ๋‚ด์šฉ์„ ์˜ค๋ฅ˜์—†์ด ์„ฑ์‹คํ•˜๊ฒŒ ๊ตฌํ˜„

- ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฉํ–ฅ์„ ์„ค์ •ํ•ด์„œ ์ด๋™ํ•˜๋Š” ๋ฌธ์ œ ์œ ํ˜•์—์„œ๋Š” dx, dy๋ผ๋Š” ๋ณ„๋„์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฉํ–ฅ์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ํšจ๊ณผ์ 

- 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•  ๋•Œ๋Š” ์ปดํ”„๋ฆฌํ—จ์…˜์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ 

- ๋‚ด ์ฝ”๋“œ์™€ ๋น„๊ต: ์™ผ์ชฝ์œผ๋กœ ํšŒ์ „ํ•˜๋Š” ๋ถ€๋ถ„์„ ํ•จ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•จ.

                           ํšŒ์ „ํ•ด์„œ ์ „์ง„ํ•˜๋Š” ๋ถ€๋ถ„ ๋ฐฉํ–ฅ ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ... + ํšŒ์ „ ํšŸ์ˆ˜ ๋ณ€์ˆ˜ ์‚ฌ์šฉ

                           (๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ๋ฅผ 0, 1, 2, 3 ์ˆœ์„œ๋กœ ๋งŒ๋“ฆ.

                            ๋‚˜๋Š” for๋ฌธ์œผ๋กœ ํšŒ์ „->์ „์ง„ํ•ด์„œ ํšŒ์ „ ๋ฐฉํ–ฅ์œผ๋กœ ๋งŒ๋“ฆ.)

๋‚ด ์•Œ๊ณ ๋ฆฌ์ฆ˜,,