๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“š Computer Science/Algorithm

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

by hyebin (Helia) 2022. 3. 22.
๋ฐ˜์‘ํ˜•

๊ตฌํ˜„(Implementation)์ด๋ž€ ๋จธ๋ฆฟ์†์— ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†Œ์Šค์ฝ”๋“œ๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ด๋‹ค.

๊ตฌํ˜„ ๋ฌธ์ œ ์œ ํ˜•์€ ๋ชจ๋“  ๋ฒ”์œ„์˜ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ ๋ฌธ์ œ ์œ ํ˜•์„ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

๊ตฌํ˜„ ์œ ํ˜•์˜ ๋ฌธ์ œ๋Š” ํ’€์ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์€ ์‰ฝ์ง€๋งŒ ์†Œ์Šค์ฝ”๋“œ๋กœ ์˜ฎ๊ธฐ๊ธฐ ์–ด๋ ค์šด ๋ฌธ์ œ์ด๋‹ค.

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ฐ„๋‹จํ•œ๋ฐ ์ฝ”๋“œ๊ฐ€ ์ง€๋‚˜์น˜๊ฒŒ ๊ธธ์–ด์ง€๋Š” ๋ฌธ์ œ
  • ํŠน์ • ์†Œ์ˆ˜์  ์ž๋ฆฌ๊นŒ์ง€ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
  • ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์กŒ์„ ๋•Œ ํŒŒ์‹ฑ ํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ

๊ตฌํ˜„ ์‹œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ์‚ฌํ•ญ

  • ๋ณ€์ˆ˜์˜ ํ‘œํ˜„ ๋ฒ”์œ„
  • ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด) ํฌ๊ธฐ

 

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

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

 


๊ตฌํ˜„ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ

์ƒํ•˜์ขŒ์šฐ

์—ฌํ–‰๊ฐ€ A๋Š” N x N ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ๊ณต๊ฐ„ ์œ„์— ์„œ ์žˆ๋‹ค. ์ด ๊ณต๊ฐ„์€ 1 x 1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ€์žฅ ์™ผ์ชฝ ์ขŒํ‘œ๋Š” (1,1)์ด๋ฉฐ, ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์ขŒํ‘œ๋Š” (N, N)์— ํ•ด๋‹นํ•œ๋‹ค.

L: ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
R: ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ด๋™
U: ์œ„๋กœ ํ•œ ์นธ ์ด๋™
D: ์•„๋ž˜๋กœ ํ•œ ์นธ ์ด๋™

๊ฐ ๋ฌธ์ž์˜ ์˜๋ฏธ๊ฐ€ ์œ„์™€ ๊ฐ™์„ ๋•Œ L, R, U, D ๋ฌธ์ž๋“ค์„ ์ž…๋ ฅ๋ฐ›์•„ A๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๋„์ฐฉํ•˜๋Š” ์ขŒํ‘œ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
(๋‹จ, N x N ์ •์‚ฌ๊ฐํ˜• ๊ณต๊ฐ„์„ ๋ฒ—์–ด๋‚˜๋Š” ์›€์ง์ž„์€ ๋ฌด์‹œ๋œ๋‹ค.)

 

var n = Int(readLine()!)!
var plans = readLine()!.split(separator: " ").map{String($0)}

var x = 1, y = 1
var new_x = 0, new_y = 0

let dx = [0, 0, -1, 1]
let dy = [-1, 1, 0, 0]
let move_type = ["L", "R", "U", "D"]

for plan in plans{
    for i in 0..<move_type.count{
        if plan == move_type[i]{
            new_x = x + dx[i]
            new_y = y + dy[i]
        }
        
        if new_x < 1 || new_y < 1 || new_x > n || new_y > n{
            continue
        }
        x = new_x
        y = new_y
    }
}

print("\(x) \(y)")

์™•์‹ค์˜ ๋‚˜์ดํŠธ

ํ–‰๋ณต ์™•๊ตญ์˜ ์™•์‹ค ์ •์›์€ ์ฒด์ŠคํŒ๊ณผ ๊ฐ™์€  8 x 8 ์ขŒํ‘œ ํ‰๋ฉด์ด๋‹ค. ์™•์‹ค ์ •์›์˜ ํŠน์ •ํ•œ ํ•œ ์นธ์—๋Š” ๋‚˜์ดํŠธ๊ฐ€ ์„œ์žˆ๋‹ค.
๋‚˜์ดํŠธ๋Š” L์ž ํ˜•ํƒœ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ •์› ๋ฐ–์œผ๋กœ๋Š” ๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค. ๋‚˜์ดํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 2๊ฐ€์ง€ ๊ฒฝ์šฐ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. ์ˆ˜ํ‰์œผ๋กœ ๋‘ ์นธ ์ด๋™ํ•œ ๋’ค์— ์ˆ˜์ง์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๊ธฐ
2. ์ˆ˜์ง์œผ๋กœ ๋‘ ์นธ ์ด๋™ํ•  ๋’ค์— ์ˆ˜ํ‰์œผ๋กœ ํ•œ ์นธ ์ด๋™ํ•˜๊ธฐ

๋‚˜์ดํŠธ์˜ ์ฒ˜์Œ ์œ„์น˜๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
var input = readLine()!.map{String($0)}
var row = Int(input[1])!
var column = Int(exactly: Character(input[0]).asciiValue!)! - Int(Character("a").asciiValue!) + 1

let steps = [[-2, -1], [-1 , -2], [1 , -2], [2, -1], [2 , 1], [1, 2], [-1, -2], [-2, 1]]

var re = 0
var next_row = 0
var next_column = 0

for step in steps{
     next_row = row + step[0]
    next_column = column + step[1]
    
    if next_row >= 1 && next_row <= 8 && next_column >= 1 && next_column <= 8{
        re += 1
    }
}

print(re)

๊ฒŒ์ž„ ๊ฐœ๋ฐœ

ํ˜„๋ฏผ์ด๋Š” ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ๊ฐ€ ๋งต ์•ˆ์—์„œ ์›€์ง์ด๋Š” ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœ ์ค‘์ด๋‹ค. ์บ๋ฆญํ„ฐ๊ฐ€ ์žˆ๋Š” ์žฅ์†Œ๋Š” 1x1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ง„ NxM ํฌ๊ธฐ์˜ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ, ๊ฐ ์นธ์€ ์œก์ง€ ๋˜๋Š” ๋ฐ”๋‹ค์ด๋‹ค. ์บ๋ฆญํ„ฐ๋Š” ๋™์„œ๋‚จ๋ถ ์ค‘ ํ•œ ๊ณณ์„ ๋ฐ”๋ผ๋ณธ๋‹ค.

๋งต์˜ ๊ฐ ์นธ์€ (a, b)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , a๋Š” ๋ถ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜, b๋Š” ์„œ์ชฝ์œผ๋กœ๋ถ€ํ„ฐ ๋–จ์–ด์ง„ ์นธ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.
์บ๋ฆญํ„ฐ๋Š” ์ƒํ•˜์ขŒ์šฐ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ , ๋ฐ”๋‹ค๋กœ ๋˜์–ด์žˆ๋Š” ๊ณต๊ฐ„์€ ๊ฐˆ ์ˆ˜ ์—†๋‹ค. ์บ๋ฆญํ„ฐ ์›€์ง์ž„ ๋งค๋‰ด์–ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
   
1. ํ˜„์žฌ ์œ„์น˜์—์„œ ํ˜•์žฌ ๋ฐฉํ–ฅ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ๋ฐฉํ–ฅ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ๊ฐˆ ๊ณณ์„ ์ •ํ•œ๋‹ค.
2. ์บ๋ฆญํ„ฐ์˜ ๋ฐ”๋กœ ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ์•„์ง ๊ฐ€๋ณด์ง€ ์•Š์€ ์นธ์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „ํ•œ ๋‹ค์Œ ์™ผ์ชฝ์œผ๋กœ ํ•œ ์นธ ์ „์ง„ํ•œ๋‹ค. ์™ผ์ชฝ ๋ฐฉํ–ฅ์— ๊ฐ€๋ณด์ง€ ์•Š์€ ์นธ์ด ์—†๋‹ค๋ฉด, ์™ผ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „๋งŒ ์ˆ˜ํ–‰ ํ›„ 1๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ„๋‹ค.
3. ๋งŒ์•ฝ ๋„ค ๋ฐฉํ–ฅ ๋ชจ๋‘ ์ด๋ฏธ ๊ฐ€๋ดค๊ฑฐ๋‚˜ ๋ฐ”๋‹ค๋ผ๋ฉด, ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉํ–ฅ์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ํ•œ ์นธ ๋’ค๋กœ ๊ฐ€๊ณ  1๋‹จ๊ณ„๋กœ ๋Œ์•„๊ฐ„๋‹ค.
    3-1 ๋’ค์ชฝ ๋ฐฉํ–ฅ์ด ๋ฐ”๋‹ค์ธ ์นธ์ด๋ผ ๋’ค๋กœ ๊ฐˆ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์›€์ง์ž„์„ ๋ฉˆ์ถ˜๋‹ค.

๋งค๋‰ด์–ผ์— ๋”ฐ๋ผ ์บ๋ฆญํ„ฐ๋ฅผ ์ด๋™์‹œํ‚จ ๋’ค, ์บ๋ฆญํ„ฐ๊ฐ€ ๋ฐฉ๋ฌธํ•œ ์นธ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“œ์‹œ์˜ค.
var input = readLine()!.split(separator: " ").map{Int(String($0))!}
var n = input[0]
var m = input[1]

//๋ฐฉ๋ฌธํ•œ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งต์„ ์ƒ์„ฑ
var d: [[Int]] = Array(repeating: Array(repeating: 0, count: m), count: n)

input = readLine()!.split(separator: " ").map{Int(String($0))!}
var x = input[0]
var y = input[1]
var direction = input[2]

//์ „์ฒด ๋งด ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
var arr: [[Int]] = Array(repeating: Array(repeating: 0, count: 0), count: n)
for i in 0..<n{
    arr[i].append(contentsOf: readLine()!.split(separator: " ").map{Int(String($0))!})
}


var dx = [-1, 0, 1, 0]
var dy = [0, 1, 0, -1]

//์™ผ์ชฝ์œผ๋กœ ํšŒ์ „
func turn_left(){
    direction -= 1
    if direction == -1{
        direction = 3
    }
}

//์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์‹œ์ž‘
var count = 0
var turn_time = 0
var nx: Int = 0
var ny: Int = 0

while true{
    turn_left()
    nx = x + dx[direction]
    ny = y + dy[direction]
    
    //ํšŒ์ „ํ•œ ์ดํ›„ ์ •๋ฉด์— ๊ฐ€๋ณด์ง€ ์•Š์€ ์นธ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋™
    if d[nx][ny] == 0 && arr[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 arr[nx][ny] == 0{
            x = nx
            y = ny
        }
        //๋’ค๊ฐ€ ๋ฐ”๋‹ค๋กœ ๋ง‰ํ˜€์žˆ๋Š” ๊ฒฝ์šฐ
        else{
            break
        }
        turn_time = 0
    }
}

print(count)
๋ฐ˜์‘ํ˜•