๐Ÿ“– Problem Solution

[Swift] 2021 KAKAO BLIND RECRUITMENT ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ

Fomagran ๐Ÿ’ป 2021. 4. 27. 15:57
728x90
๋ฐ˜์‘ํ˜•

 

Problem

 

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์นด๋“œ ์ง ๋งž์ถ”๊ธฐ

[[1,0,0,3],[2,0,0,0],[0,0,0,2],[3,0,1,0]] 1 0 14 [[3,0,0,2],[0,0,1,0],[0,1,0,0],[2,0,0,3]] 0 1 16

programmers.co.kr


Solution

 

๋ชจ๋“  ์นด๋“œ๋ฅผ ๋’ค์ง‘๋Š” ์ตœ์†Œ ์กฐ์ž‘ํšŸ์ˆ˜๋ฅผ ์ฐพ์•„์•ผ ํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

(BFS๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•๊ณผ ์ˆœ์—ด๊ตฌํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„์•ผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ˆ˜์›”ํ•˜์‹ค๊ฒ๋‹ˆ๋‹ค.)

 

1. ์นด๋“œ๋ฅผ ๋’ค์ง‘๋Š” ์ˆœ์„œ๋ฅผ ์ •ํ•˜๊ธฐ(์ˆœ์—ด ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ๊ธฐ)

 

๋งŒ์•ฝ 1,2,3 ์นด๋“œ๊ฐ€  ์žˆ๋‹ค๋ฉด 1 - 2 - 3, 1 - 3 - 2, 2 - 1 - 3... ๋“ฑ์œผ๋กœ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ˆœ์—ด์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น ํ•˜๋‚˜์”ฉ ์ˆซ์ž๋ฅผ ์ง€์›Œ๋‚˜๊ฐ€๋ฉด์„œ depth์— ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์นด๋“œ๋Š” ๊ฐ ๊ฐ 2์žฅ์”ฉ ์žˆ์œผ๋ฏ€๋กœ ๋˜‘๊ฐ™์€ ์ˆซ์ž ์นด๋“œ๋ผ๋„ ๋จผ์ € ๋’ค์ง‘์„ ์นด๋“œ ์ˆœ์„œ๋„ ์ •ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

(startCardGame์„ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”!)

 

2. BFS๋กœ ๋ชจ๋“  ์ด๋™์— ๋Œ€ํ•œ ์กฐ์ž‘ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ

 

์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ,์•„๋ž˜์ชฝ,์œ„์ชฝ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ctrl์„ ๋ˆ„๋ฅด๊ณ  ์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ,์•„๋ž˜์ชฝ,์œ„์ชฝ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด 8๊ฐ€์ง€๋กœ

 

์ด๋™ํ–ˆ์„ ๋•Œ ์กฐ์ž‘ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด ๋•Œ BFS๋กœ ์ด๋™์— ๋Œ€ํ•œ ๊ฐ’์„ queue์— ๋„ฃ์–ด๋‘๊ณ  queue์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ๊ฐ’์„ ์‚ญ์ œํ•ด ๋‚˜๊ฐ€๋ฉด์„œ ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋˜ํ•œ  4x4 Bool์„ ๋‹ด์„ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋ฐฉ๋ฌธํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์ค๋‹ˆ๋‹ค.

 

(moveCurrentToGoal๊ณผ moveBFS๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)

 

3. ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’ ์ฐพ๊ธฐ

 

์ •๋‹ต(answer) ๋ณ€์ˆ˜๋ฅผ ์ •์ˆ˜์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’์ธ Int.max๋กœ ๋†“์Šต๋‹ˆ๋‹ค.

 

์นด๋“œ๋ฅผ ๋’ค์ง‘์„ ๋•Œ๋งˆ๋‹ค depth์— ์ˆซ์ž๋“ค์„ ๋‹ด์•„๋†“๊ณ  ๋ชจ๋“  ์ˆซ์ž๋“ค์ด ๋’ค์ง‘์–ด์กŒ์„๋•Œ ์ฆ‰, depth์— ์นด๋“œ๊ฐฏ์ˆ˜/2๋งŒํผ์˜ ์ˆซ์ž๊ฐ€ ์ฑ„์›Œ์กŒ์„๋•Œ

 

answer์™€ count๋ฅผ ๋น„๊ตํ•ด ๋” ์ž‘๋‹ค๋ฉด answer๋ฅผ count๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ๋ชจ๋“  ์ˆœ์—ด์— ๋Œ€ํ•œ ์กฐ์ž‘ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ณ  ๋” ์ž‘์€ ๊ฐ’์œผ๋กœ answer๋ฅผ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ answer์— ์–ด์ฐจํ”ผ ์นด๋“œ๋“ค์€ ๋’ค์ง‘์–ด์งˆ ๋•Œ๋งˆ๋‹ค +1์ด๋ฏ€๋กœ ์นด๋“œ์˜ ๊ฐฏ์ˆ˜๋งŒํผ์„ ๋”ํ•ด์ฃผ๊ณ  return ํ•ด์ค๋‹ˆ๋‹ค.

 

(solution์„ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!)


Source Code

 

func solution(_ board:[[Int]], _ r:Int, _ c:Int) -> Int {
//์ •๋‹ต
var answer = Int.max
//์นด๋“œ ๊ฐฏ์ˆ˜
var cardsCount:Int = 0
//board ์ „์ฒด๋ฅผ ํƒ์ƒ‰ํ•ด 0์ด ์•„๋‹Œ ์ˆซ์ž๋ฅผ ์„ธ์ค€๋‹ค.(์นด๋“œ์˜ ๊ฐฏ์ˆ˜)
cardsCount = board.flatMap{$0}.filter{$0 != 0}.count
//์นด๋“œ์˜ ์œ„์น˜๊ฐ€ ์–ด๋”จ๋Š”์ง€ ์ฐพ์Œ.
let cards = findAllNumbersLocation(board: board)
//์นด๋“œ๊ฒŒ์ž„ ์‹œ์ž‘
startCardGame(answer:&answer,cardsCount:&cardsCount,board: board, start: (c,r), count: 0, cards: cards,depth:[])
//์–ด์ฐจํ”ผ ์นด๋“œ ๊ฐฏ์ˆ˜๋งŒํผ enter๋ฅผ ํ•˜๋ฏ€๋กœ ์นด๋“œ ๊ฐฏ์ˆ˜๋งŒํผ ๋”ํ•ด์ค€๋‹ค.
return answer + cardsCount
}
func startCardGame(answer:inout Int,cardsCount:inout Int,board:[[Int]],start:(Int,Int),count:Int,cards:[[(Int,Int)]],depth:[Int]) {
//count๊ฐ€ answer๋ณด๋‹ค ํฌ๋ฉด ๋” ์ด์ƒ ์ง„ํ–‰ํ•  ํ•„์š” ์—†์œผ๋ฏ€๋กœ return
if answer != Int.max && count >= answer {
return
}
//depth๊ฐ€ ์นด๋“œ์˜ ๊ฐฏ์ˆ˜/2๋Š” ์ฆ‰ ๋ชจ๋“  ์นด๋“œ๋ฅผ ๋’ค์ง‘์€ ๊ฒƒ์ด๊ณ  && count๊ฐ€ answer๋ณด๋‹ค ์ž‘์„๋•Œ
if depth.count == cardsCount/2 && answer > count {
//answer๋ฅผ count๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
answer = count
return
}
//์นด๋“œ๋ฅผ ํƒ์ƒ‰
for (i,card) in cards.enumerated(){
//์ƒˆ๋กœ์šด ๋ณด๋“œ
var newBoard = board
//์ƒˆ๋กœ์šด ๋ށ์Šค
var newDepth = depth
//์ƒˆ๋กœ์šด ์นด๋“œ
var newCards = cards
//์นด๋“œ๊ฐ€ ๋น„์—ˆ๋‹ค๋ฉด ์ง„ํ–‰ํ•˜์ง€ ์•Š์Œ
if card.isEmpty { continue }
//์‹œ์ž‘๋ถ€ํ„ฐ ์ฒซ๋ฒˆ์งธ ์นด๋“œ๊นŒ์ง€ ์ฒซ๋ฒˆ์žฌ ์นด๋“œ๋ถ€ํ„ฐ ๋‘๋ฒˆ์งธ ์นด๋“œ๊นŒ์ง€์˜ count
let count1 = moveCurrentToGoal(current: start, goal: card[0], count: 0, board: board) + moveCurrentToGoal(current: card[0], goal: card[1], count: 0, board: board)
//์‹œ์ž‘๋ถ€ํ„ฐ ๋‘๋ฒˆ์งธ ์นด๋“œ๊นŒ์ง€ ๋‘๋ฒˆ์งธ ์นด๋“œ๋ถ€ํ„ฐ ์ฒซ๋ฒˆ์งธ ์นด๋“œ๊นŒ์ง€์˜ count
let count2 = moveCurrentToGoal(current: start, goal: card[1], count: 0, board: board) + moveCurrentToGoal(current: card[1], goal: card[0], count: 0, board: board)
//ํ•ด๋‹น ๋ฒˆํ˜ธ์˜ ์นด๋“œ๋ฅผ ๋ชจ๋‘ ์—†์• ์ค€๋‹ค.
newCards[i] = []
//๋ณด๋“œ์—์„œ ์ฒซ๋ฒˆ์งธ ์นด๋“œ ์œ„์น˜๋ฅผ ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
newBoard[card[0].1][card[0].0] = 0
//๋ณด๋“œ์—์„œ ๋‘๋ฒˆ์งธ ์นด๋“œ ์œ„์น˜๋ฅผ ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
newBoard[card[1].1][card[1].0] = 0
//๋ށ์Šค์— ๋ฒˆํ˜ธ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
newDepth.append(i)
//count1๊ณผ count2 ์ค‘ ๋” ์ž‘์€ ๊ฒƒ์„ count์— ๋”ํ•ด์ฃผ๊ณ  startCardGame์„ ์žฌ๊ท€ํ•ด์คŒ.
if count1 < count2 {
startCardGame(answer:&answer,cardsCount:&cardsCount,board: newBoard, start: card[1], count: count + count1, cards: newCards,depth: newDepth)
}else {
startCardGame(answer:&answer,cardsCount:&cardsCount,board: newBoard, start: card[0], count: count + count2, cards: newCards,depth: newDepth)
}
}
}
//๋ชจ๋“  ์ˆซ์ž๋“ค์˜ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ํ•จ์ˆ˜
func findAllNumbersLocation(board:[[Int]]) -> [[(Int,Int)]]{
var newCards = Array(repeating: [(Int,Int)](), count: 7)
for (y,row) in board.enumerated() {
for (x,number) in row.enumerated() {
if number != 0 {
newCards[number].append((x,y))
}
}
}
return newCards
}
//ํ˜„์žฌ๋ถ€ํ„ฐ ๋ชฉ์ ์ง€๊นŒ์ง€ ๊ฐ€๋Š” ํ•จ์ˆ˜
func moveCurrentToGoal(current:(Int,Int),goal:(Int,Int),count:Int,board:[[Int]]) -> Int{
//๊ฐ€์žฅ ์ž‘์€ count๋ฅผ ๋‹ด์„ ๋ณ€์ˆ˜
var minCount = Int.max
//BFS๊ตฌํ˜„์„ ์œ„ํ•œ ๋ณ€์ˆ˜
var queue:[((Int,Int),(Int,Int),Int,[[Int]])] = [(current,goal,count,board)]
//๋ฐฉ๋ฌธ์ด๋ ฅ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋ณ€์ˆ˜
var visited:[[Bool]] = Array(repeating: Array(repeating:false, count: 4), count: 4)
//ํ๊ฐ€ ๋น„์ง€ ์•Š์•—๋‹ค๋ฉด
while !queue.isEmpty {
//minCount๊ฐ€ Int.max๊ฐ€ ์•„๋‹ˆ๋ž€ ๊ฒƒ์€ ์–ด๋–ค ์ˆซ์ž๊ฐ€ ๋“ค์–ด์™”๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ
if minCount != Int.max {
//minCount๋ฅผ return ํ•ด์ค€๋‹ค.
return minCount
}
//queue์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ๋ฅผ ์‚ญ์ œํ•ด์ฃผ๋ฉด์„œ ์ €์žฅํ•จ.
let first = queue.removeFirst()
//๊ฐ€์žฅ ํ์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์žˆ๋Š” ๊ฐ’์„ BFS์— ๋„ฃ์–ด์คŒ.
moveBFS(current: first.0, goal: first.1, count: first.2,board: first.3,minCount:&minCount,queue:&queue,visited: &visited)
}
return minCount
}
//BFS๋กœ ํ˜„์žฌ๋ถ€ํ„ฐ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ํ•จ์ˆ˜
func moveBFS(current:(Int,Int),goal:(Int,Int),count:Int,board:[[Int]],minCount:inout Int,queue: inout [((Int,Int),(Int,Int),Int,[[Int]])],visited:inout [[Bool]]) {
//๋ฐฉ๋ฌธํ–ˆ๊ฑฐ๋‚˜ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋ฒฝ๋ณด๋‹ค ๋” ๋ฐ”๊นฅ์ด๋ฉด return
if current.0 > 3 || current.1 > 3 || current.0 < 0 || current.1 < 0 {
return
}
//๋ฐฉ๋ฌธํ•œ ์ ์ด ์—†๋‹ค๋ฉด ํ•ด๋‹น ์œ„์น˜๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
if visited[current.1][current.0] == false {
visited[current.1][current.0] = true
}else {
//๋ฐฉ๋ฌธํ–ˆ๋‹ค๋ฉด return
return
}
//ํ˜„์žฌ์œ„์น˜๊ฐ€ ๋ชฉ์ ์ง€์™€ ๊ฐ™๋‹ค๋ฉด minCount๋ฅผ count๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
if current == goal{
minCount = count
return
}
//์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ,์œ„์ชฝ,์•„๋ž˜์ชฝ ctrl + ์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ,์œ„์ชฝ,์•„๋ž˜์ชฝ 8๊ฐ€์ง€ ์ด๋™์„ ๋‹ด์€ ๋ณ€์ˆ˜
let moves = [moveLeft(current: current),moveRight(current: current),moveUp(current: current),moveDown(current: current),moveCtrlLeft(goalX: goal.0, currentX: current.0, y: current.1, board: board),moveCtrlRight(goalX: goal.0, currentX: current.0, y: current.1, board: board),moveCtrlUp(goalY: goal.1, currentY: current.1,x: current.0,board: board),moveCtrlDown(goalY: goal.1, currentY: current.1,x: current.0,board: board)]
//8๊ฐ€์ง€ ์ด๋™์„ ๋ชจ๋‘ ํ•ด์ค€๋‹ค.
for move in moves {
//ํ˜„์žฌ ์œ„์น˜๊ฐ€ ๋ฒฝ ์•ˆ์— ์žˆ๋‹ค๋ฉด
if current.0 <= 3 && current.1 <= 3 && current.0 >= 0 && current.1 >= 0 {
//ํ์— ๋„ฃ์–ด์ค€๋‹ค.
queue.append((move,goal,count+1,board))
}
}
}
//์™ผ์ชฝ์œผ๋กœ 1์นธ ์ด๋™
func moveLeft(current:(Int,Int)) -> (Int,Int) {
return (current.0-1,current.1)
}
//์˜ค๋ฅธ์ชฝ์œผ๋กœ 1์นธ ์ด๋™
func moveRight(current:(Int,Int)) -> (Int,Int){
return (current.0+1,current.1)
}
//์•„๋ž˜์ชฝ์œผ๋กœ 1์นธ ์ด๋™
func moveDown(current:(Int,Int)) -> (Int,Int) {
return (current.0,current.1+1)
}
//์œ„์ชฝ์œผ๋กœ 1์นธ ์ด๋™
func moveUp(current:(Int,Int)) -> (Int,Int) {
return (current.0,current.1-1)
}
//ctrl + ์™ผ์ชฝ์œผ๋กœ ์ด๋™
func moveCtrlLeft(goalX:Int,currentX:Int,y:Int,board:[[Int]]) -> (Int,Int) {
//์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์•ผํ•˜๋Š”๋ฐ ๋ชฉ์ ์ง€์˜ x๊ฐ€ ํ˜„์žฌ ์œ„์น˜์˜ x๋ณด๋‹ค ๋” ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ์•ˆ๋˜๋ฏ€๋กœ ๋ฒฝ ๋ฐ”๊นฅ์œผ๋กœ ๋ฐ€์–ด๋ฒ„๋ฆผ.
if goalX >= currentX {
return (4,4)
}
var newX = 0
//๋ชฉ์ ์ง€์™€ ํ˜„์žฌ x์˜ ์œ„์น˜ ์‚ฌ์ด์—
for x in goalX..<currentX {
//์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด
if board[y][x] != 0 {
//newX๋ฅผ ํ•ด๋‹น ์ˆซ์ž๋กœ ๋ฐ”๊ฟ”์คŒ
newX = x
}
}
//์ˆซ์ž๊ฐ€ ์—†๋‹ค๋ฉด 0์œผ๋กœ ๊ฐ€์žฅ ์™ผ์ชฝ์œผ๋กœ ์˜ฎ๊น€
return (newX,y)
}
//ctrl + ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™
func moveCtrlRight(goalX:Int,currentX:Int,y:Int,board:[[Int]]) -> (Int,Int){
if goalX <= currentX {
return (4,4)
}
for x in currentX+1...goalX {
if board[y][x] != 0 {
return (x,y)
}
}
return (3,y)
}
//ctrl + ์œ„์ชฝ์œผ๋กœ ์ด๋™
func moveCtrlUp(goalY:Int,currentY:Int,x:Int,board:[[Int]]) -> (Int,Int){
if goalY >= currentY {
return (4,4)
}
var newY = 0
for y in goalY..<currentY {
if board[y][x] != 0 {
newY = y
}
}
return (x,newY)
}
//ctrl + ์•„๋ž˜์ชฝ์œผ๋กœ ์ด๋™
func moveCtrlDown(goalY:Int,currentY:Int,x:Int,board:[[Int]]) -> (Int,Int){
if goalY <= currentY {
return (4,4)
}
for y in currentY+1...goalY {
if board[y][x] != 0 {
return (x,y)
}
}
return (x,3)
}

P.S

 

์ฒ˜์Œ์— ๋ชจ๋“  ์นด๋“œ๋ฅผ ๋’ค์ง‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” ๊ทธ๋ƒฅ ๋ชจ๋“  ์นด๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๋’ค์ง‘์€ ์นด๋“œ๋ฅผ ์ง€์šฐ๊ณ  ๋˜ ๋‚จ์€ ์นด๋“œ๋“ค์„

 

๋˜‘๊ฐ™์ด ๋ฐ˜๋ณตํ•ด์ฃผ๋ฉด ๋˜์ง€ ์•Š๋‚˜? ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์•ˆ๋๋‹ค..

 

๊ทผ๋ฐ ์‹ค์ œ๋กœ ์Œ“์ด๋Š” ์ˆซ์ž๋“ค์„ ๋ณด๋ฉด ์ˆœ์—ด๊ณผ ๋˜‘๊ฐ™์ด ์Œ“์ด๊ธดํ•˜๋Š”๋ฐ.. ์™œ ์•ˆ๋ ๊นŒ?

 

BFS๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์—๋Š” ํ˜„์žฌ x,y์™€ ๋ชฉ์ ์ง€์˜ x,y๋ฅผ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•ด์„œ x๋จผ์ € ๋งž์ถ”๊ณ  y๋ฅผ ๋งž์ถœ๋•Œ์™€ y ๋จผ์ € ๋งž์ถ”๊ณ  x๋ฅผ ๋งž์ถœ๋•Œ๋ฅผ

 

๊ตฌํ•˜๋ฉด ๋˜๊ฒ ์ง€ํ–ˆ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์ด 4์—์„œ 4๋กœ ์ด๋™ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” y๋ฅผ ํ•œ์นธ๋งŒ ์›€์ง์ด๊ณ  x์—์„œ ctrl๋กœ ์›€์ง์ด๊ณ 

 

๋‹ค์‹œ y๋ฅผ ์›€์ง์—ฌ์•ผ ๋˜๋ฏ€๋กœ ๋ชจ๋“  ์ด๋™์— ๋Œ€ํ•œ ์กฐ์ž‘ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด์ค˜์•ผ ํ–ˆ๋‹ค.

 

 

 

์ด๊ฑฐ ํ•œ ๋ฌธ์ œ ํ‘ธ๋Š”๋ฐ ๊ฑฐ์˜ ์ผ์ฃผ์ผ๊ฑธ๋ฆฐ๊ฑฐ ๊ฐ™๋‹ค....

 

๊ณ ์ง‘๋„ ๋งŽ์ด ๋ถ€๋ฆฌ๊ณ  ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ํ’€๊ฑฐ์•ผ๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๊ฑฐ ๊ฐ™๋‹ค...

 

๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋‚ด๋ ค๋†“๊ณ  ๋ฐฐ์šฐ๋Š” ๋งˆ์Œ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค.


Reference

 

 

2021 ์นด์นด์˜ค ์‹ ์ž…๊ณต์ฑ„ 1์ฐจ ์˜จ๋ผ์ธ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ for Tech developers ๋ฌธ์ œํ•ด์„ค

์ง€๋‚œ 2020๋…„ 9์›” 12์ผ ํ† ์š”์ผ ์˜คํ›„ 2์‹œ๋ถ€ํ„ฐ 7์‹œ๊นŒ์ง€ 5์‹œ๊ฐ„ ๋™์•ˆ 2021 ์นด์นด์˜ค ์‹ ์ž… ๊ฐœ๋ฐœ์ž ๊ณต์ฑ„ 1์ฐจ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—๋Š” ์ด 7๊ฐœ์˜ ๋ฌธ์ œ๊ฐ€ ์ถœ์ œ๋˜์—ˆ์œผ๋ฉฐ, ๊ฐœ๋ฐœ ์–ธ์–ด๋Š” C++, Java, Jav

tech.kakao.com

728x90
๋ฐ˜์‘ํ˜•
๋Œ“๊ธ€์ˆ˜0