์๋ ํ์ธ์ Foma๐ ์ ๋๋ค!
ํ์์ ์ฝ๋๋ฅผ ๊ฐ๋ ์ฑ ์๊ฒ ์์ฑํ ๋ ํ์์ ์ด๋ป๊ฒ ๋ง์ถฐ์ผ ๋ ๊น? ์ ๋ํ ๊ณ ๋ฏผ๊ณผ
๋ ๋ค๋ฅธ ์ฌ๋์ด ๋ณผ ๋ ์ ๋งคํ ์ฝ๋๋ฅผ ์ ์์ ๋ ์ฃผ์์ผ๋ก ์ด๋ป๊ฒ ์ค๋ช ํด์ผ ํ ๊น? ์ ๋ํ ๊ณ ๋ฏผ์ ํ์๋๋ฐ์.
ํด๋ฆฐ ์ฝ๋์์ ์ข์ ์ฃผ์๊ณผ ๋์ ์ฃผ์, ๊ฐ๋ ์ฑ ์๊ฒ ํ์์ ๋ง์ถ๋ ๋ฒ์ ๋ํด์ ์๊ฒ ๋์ด ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค.
(์ ๊ฐ ํ์์ ๋ง์ด ์ฐ๋ ๋์ ๋ฒ๋ฆ์ด๋ ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ ๊ฒ ์์ฃผ๋ก ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.)
๋ฐ๋ก ์์ํ ๊ฒ์~
์ฃผ์
์ด ์ฑ ์ ์ ์์ธ ๋ฐฅ ์์ ์จ๋ ์ฃผ์์ ๋ํด์ ์ด๋ ๊ฒ ๋งํฉ๋๋ค.
์ฃผ์์ ๊ธฐ๊ปํด์ผ ํ์์ ์ด๋ค. ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์์ฒด๋ฅผ ์น๋ฐํ๊ฒ ์ฌ์ฉํด ์๋๋ฅผ ํํํ ๋ฅ๋ ฅ์ด ์๋ค๋ฉด ์ฃผ์์ ๊ฑฐ์ ํ์ํ์ง ์๋ค.
์ด๋ ๊ฒ ์ฃผ์์ ๋ฌด์ํ๋ ์ด์ ๋ ๋ฌด์์ผ๊น์?
๋ฐ๋ก ์ฃผ์์ ์ค๋๋๋ฉด ์ค๋๋ ์๋ก ๊ทธ๋ฆ๋ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฝ๋๊ฐ ๋ณํํ๊ณ ์งํํ ์๋ก ์กฐ๊ฐ์ด ๋๋์ด์ง๊ณ ํฉ์ณ์ง๋๋ฐ ์ฌ๊ธฐ์ ์ฃผ์๊น์ง ์ ์งํ๊ณ ๋ณด์ํ๊ธฐ๋ ํ์ค์ ์ผ๋ก ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์ด๋ ๊ฒ ๊ทธ๋ฆ๋ ์ฃผ์์ ํ๋ก๊ทธ๋๋จธ์๊ฒ ๊ฑฐ์ง๋ง์ ํ๊ณ ์๋ชป๋ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ฒ ๋๋๋ฐ
์ด๊ฒ์ ํ๋ก๊ทธ๋๋จธ์ ์๊ฐ๊ณผ ์๋์ง๋ฅผ ๋บ๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง ๋์ ๋ฐ๋ผ ํ์ํ๊ฑฐ๋ ์ ์ตํ ์ฃผ์์ด ์๊ณ ์ ๋ง๋ก ์ฌ์ฉํ๋ฉด ์๋๋ ๋์ ์ฃผ์์ด ์์ต๋๋ค.
์ง๊ธ๋ถํฐ๋ ์ข์ ์ฃผ์๊ณผ ๋์ ์ฃผ์์ ๋ํด ์๊ฐํ๋๋ก ํ๊ฒ ์ต๋๋ค.
์ข์ ์ฃผ์ ๐๐ป
1. ๋ฒ์ ์ธ ์ฃผ์
์๋์ ๊ฐ์ด ์ ์๊ถ ์ ๋ณด๋ ์์ ๊ถ ์ ๋ณด๋ ์์ค ํ์ผ ์ฒซ ๋จธ๋ฆฌ์ ๋ช ์ํด์ผ ํฉ๋๋ค.
// Copyright (C) 2003, 2004, 2005 by Object Montor, Inc. All right reserved.
// GNU General Public License
2. ์ ๋ณด๋ ์๋๋ฅผ ์ค๋ช ํ๋ ์ฃผ์
์ถ์ ๋ฉ์๋์ ๋ฐํ๊ฐ์ด๋ ์ ๊ทํํ์์ด ์ด๋ค ๊ฒ์ ๋ปํ๋์ง์ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ฑฐ๋,
ํด๋น ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ์ด๋ ์ค์์ฑ์ ๊ฐ์กฐํ๋ ์ฃผ์์ด๋,
ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ค ๊ฒ์ ์๋ํ๋์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ช ์ํด๋์ผ๋ฉด ํ ํ๋ก๊ทธ๋๋จธ์ ์๊ฐ์ ์๊ปด์ค ์ ์์ต๋๋ค.
3. TODO ์ฃผ์
์์ง ์์ฑํ์ง ๋ชปํ ์ฝ๋๋ ์์ง ๊ตฌํํ์ง ๋ชปํ ์ฝ๋๋ฅผ ๋ฏธ๋์ ์์ฑํด์ผ ํ๋ค๋ฉด TODO ์ฃผ์์ผ๋ก ์์ผ๋ก ํ ์ผ์
์ค๋ช ํด๋์ ์ ์์ต๋๋ค.
๋์ ์ฃผ์ โ
1. ๊ฐ์ ์ด์ผ๊ธฐ๋ฅผ ํ๋ ์ฃผ์
์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ค๋ช ํด์ฃผ๋ ์ฃผ์ ๋์ ์ฝ๋๋ก ๋ช ํํ๊ฒ ํํํด์ผ ํฉ๋๋ค.
(์ ๋ ํ์์ ์ด๋ฐ์์ผ๋ก ๋ง์ด ๋ฌ์์ ์กฐ๊ธ ์ฐ๋ฆฌ๋ค์..)
//์ด๋ฆ์ ๋ํ๋ด๋ ๋ณ์
var name = "Fomagran"
2. ๊ธฐ๋กํ๋ ์ฃผ์
๋๋๋ก ์ฌ๋๋ค์ ์ด๋ค ์ฌ๋์ด ์ธ์ ์ฝ๋๋ฅผ ์์ ํ๋์ง๋ฅผ ์ ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
์ด๋ฐ ๊ฒ๋ค์ ์์ค ์ฝ๋ ๊ด๋ฆฌ ์์คํ ์๊ฒ ๋งก๊ฒจ์ผํฉ๋๋ค.
/*
*11-Oct-2021 ํด๋์ค๋ฅผ ๋ค์ ์ ๋ฆฌํ๊ณ ์๋ก์ด ํจํค์ง์ธ
com.jrefinery.date๋ก ์ฎ๊ฒผ๋ค.
*05-Nov-2021 getDescription() ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์ผ๋ฉฐ
NotableDate class๋ฅผ ์ ๊ฑฐํ๋ค.
*/
3. ๋ซ๋ ๊ดํธ์ ์ฐ๋ ์ฃผ์
๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์๋์ ๊ฐ์ด ๋ซ๋ ๊ดํธ์ ํน์ํ ์ฃผ์์ ๋ฌ์๋๊ณค ํฉ๋๋ค.
๋ซ๋ ์ฃผ์์ ๊ดํธ๋ฅผ ๋ค๋ ๊ฒ ๋์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ค์ด๋ ค๋ ์๋๋ฅผ ํด์ผ ํฉ๋๋ค.
func add(n1:Int,n2:Int,infos:[Int]) {
for info in infos {
if n1 < n2{
while infos.isEmpty {
}//while
}//if
}//for
}
ํ์
์ฝ๋๊ฐ ๊น๋ํ๊ณ , ์ผ๊ด์ ์ด๊ณ , ๊ผผ๊ผผํ๊ฒ ์ ๋ฌธ๊ฐ๊ฐ ์งฐ๋ค๋ ์ธ์์ ์ฃผ๊ธฐ ์ํด์
์ฝ๋ ํ์์ ๋ง์ถ๊ธฐ ์ํ ๊ท์น์ ์ ํ๊ณ ๊ทธ ๊ท์น์ ์ฐฉ์คํ ๋ฐ๋ผ์ผ ํ๋ค๊ณ ํฉ๋๋ค.
์ด๋ ๊ฒ ํํํ ์ก์๋์ ๊ตฌํ ์คํ์ผ๊ณผ ๊ฐ๋ ์ฑ ์์ค์ ์ ์ง๋ณด์ ์ฉ์ด์ฑ๊ณผ ํ์ฅ์ฑ์ ๊ณ์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋๊ณ
์ด๊ฒ์ ์ฝ๋์ ํ์ง๊ณผ ์์ฐ์ฑ์ ํฅ์์ํต๋๋ค.
์ ์ ํ ํ ๊ธธ์ด๋ฅผ ์ ์งํ๋ผ
์๋ 7๊ฐ ํ๋ก์ ํธ์ ๋ํ ํ์ผ ๊ธธ์ด ๋ถํฌ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ธ๋ฐ
ํ๊ท ํ์ผ ๊ธธ์ด๋ ์ฝ 65์ค์ด๋ฉฐ ๋๋ต 1/3์ด 40์ค์์ 100์ค์ ๋๋ ์ ๋์ด๋ค.
์ด๊ฒ์ 500์ค์ ๋์ง ์๊ณ ๋๋ถ๋ถ 200์ค ์ ๋์ธ ํ์ผ๋ก๋ ์ปค๋ค๋ ์์คํ ์ ๊ตฌ์ถํ ์ ์๋ค๋ ์ฌ์ค์ ๋ํ๋ ๋๋ค.
๊ฐ๋ ์ ๋น ํ์ผ๋ก ๊ตฌ๋ถํ๋ผ
ํจํค์ง ์ ์ธ๋ถ,import๋ฌธ,๊ฐ ํจ์ ์ฌ์ด์ ๋น ํ์ ์ถ๊ฐํด์ ์๋ก์ด ๊ฐ๋ ์ด ์์ํ๋ค๋ ๋จ์๋ฅผ ๋จ๊ธฐ๋๋ก ํด์ผํฉ๋๋ค.
๋์ ์ โ
import Foundation
func getManhattanDistance(p1:Seat,p2:Seat) -> Int {
return abs(p1.0-p2.0) + abs(p1.1-p2.1)
}
func isKeepDistance(p1:Seat,p2:Seat,xMap:inout [[String]]) -> Bool {
let minX = p1.0 < p2.0 ? p1 : p2
let minY = p1.1 < p2.1 ? p1 : p2
if p1.0 == p2.0 {
return xMap[minY.1+1][p1.0] == "X"
}else if p1.1 == p2.1 {
return xMap[p1.1][minX.0+1] == "X"
}else{
if p1.0 < p2.0 {
return xMap[p1.1][p1.0+1] == "X" && xMap[p2.1][p2.0-1] == "X"
}else {
return xMap[p2.1][p2.0+1] == "X" && xMap[p1.1][p1.0-1] == "X"
}
}
}
์ข์ ์ ๐๐ป
import Foundation
func getManhattanDistance(p1:Seat,p2:Seat) -> Int {
return abs(p1.0-p2.0) + abs(p1.1-p2.1)
}
func isKeepDistance(p1:Seat,p2:Seat,xMap:inout [[String]]) -> Bool {
let minX = p1.0 < p2.0 ? p1 : p2
let minY = p1.1 < p2.1 ? p1 : p2
if p1.0 == p2.0 {
return xMap[minY.1+1][p1.0] == "X"
}else if p1.1 == p2.1 {
return xMap[p1.1][minX.0+1] == "X"
}else{
if p1.0 < p2.0 {
return xMap[p1.1][p1.0+1] == "X" && xMap[p2.1][p2.0-1] == "X"
}else {
return xMap[p2.1][p2.0+1] == "X" && xMap[p1.1][p1.0-1] == "X"
}
}
}
์ข ์์ ์ด๊ฑฐ๋ ์ ์ฌํ ์ฝ๋๋ ๊ฐ๊น์ด ๋์ด๋ผ
์ค๋ฐ๊ฟ์ด ๊ฐ๋ ์ ๋ถ๋ฆฌํ๋ค๋ฉด ์ธ๋ก ๋ฐ์ง๋๋ ์ฐ๊ด์ฑ์ ์๋ฏธํฉ๋๋ค.
์ฆ, ์๋ก ๋ฐ์ ํ ์ฝ๋ ํ์ ์ธ๋ก๋ก ๊ฐ๊น์ด ๋์ฌ์ผ ํ๋ค๋ ๋ป์ ๋๋ค.
ํ ํจ์๊ฐ ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถ ํ๋ค๋ฉด ๋ ํจ์๋ ์ธ๋ก๋ก ๊ฐ๊น์ด ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
๋ํ ๊ฐ๋ฅํ๋ค๋ฉด ํธ์ถํ๋ ํจ์๋ฅผ ํธ์ถ๋๋ ํจ์๋ณด๋ค ๋จผ์ ๋ฐฐ์นํฉ๋๋ค.
์ด๋ ๊ฒ ์ผ๊ด์ ์ผ๋ก ์ ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋์ ํธ์ถํ ํจ์๊ฐ ์ ์ ํ์ ์ ์๋๋ฆฌ๋ผ๊ณ ์์ธกํ ์ ์์ต๋๋ค.
func solution(_ places:[[String]]) -> [Int] {
var answer:[Int] = []
for place in places {
...
getSeatLocation(places: place,xMap: &xMap,applicants: &applicants)
outer:while !applicants.isEmpty {
for applicant in applicants {
if getManhattanDistance(p1: first, p2: applicant) <= 2 {
if !isKeepDistance(p1: first, p2: applicant,xMap: &xMap) {
...
}
}
}
}
...
}
return answer
}
func getSeatLocation(places:[String],xMap:inout [[String]],applicants:inout [Seat]) {
...
}
func getManhattanDistance(p1:Seat,p2:Seat) -> Int {
...
}
func isKeepDistance(p1:Seat,p2:Seat,xMap:inout [[String]]) -> Bool {
...
}
์ข ์์ ์ธ ๊ด๊ณ๊ฐ ์๋๋ผ๋ ๋ช ๋ช ๋ฒ์ด ๊ฐ๊ฑฐ๋ ๊ธฐ๋ณธ๊ธฐ๋ฅ์ด ์ ์ฌํ ํจ์๋ ์ธ๋ก๋ก ๊ฐ๊น์ด ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
class Assert {
static func assertTrue(message:String,condition:Bool) {
}
static func assertTrue(condition:Bool) {
}
static func assertFalse(message:String,condition:Bool) {
}
static func assertFalse(condition:Bool) {
}
}
ํ ๊ธธ์ด
ํ ํ์ ๊ฐ๋ก๋ก ์ผ๋ง๋ ์ ๋นํด์ผ ํ ๊น ๋ํ ๋ง์ด ๊ณ ๋ฏผํ์๋ ๊ฒ ์ค ํ๋์ธ๋ฐ์.
์ ๊ทธ๋ํ๋ ํฐ 7๊ฐ ํ๋ก์ ํธ์ ํ ๊ธธ์ด๋ฅผ ๋ํ๋ธ ๊ฒ์ ๋๋ค.
20~60์๊ฐ 40%์ด๊ณ 10์ ๋ฏธ๋ง์ 30%์ด๋ฉฐ 80์ ์ดํ๋ถํฐ๋ ๊ธ๊ฒฉํ ๊ฐ์ํฉ๋๋ค.
์ ์์ธ ๋ฐฅ ์์ ์จ๋ 100์์์ 120์์ ๋ฌํด๋ ๋์์ง ์์ผ๋ฉฐ ์์ ์ 120์๋ก ์ ํํ๋ค๊ณ ๋งํฉ๋๋ค.
๋ค์ฌ์ฐ๊ธฐ
์์ค ํ์ผ์ ํด๋์ค,๋ฉ์๋,๋ธ๋ก ๋ด์ ์ ์ฉ๋๋ ์ ๋ณด๋ค์ด ์์ต๋๋ค.
์ด๋ ๊ฒ ๋ฒ์๋ก ์ด๋ฃจ์ด์ง ๊ณ์ธต์ ํํํ๊ธฐ ์ํด ๋ค์ฌ์ฐ๊ธฐ ์ฌ์ฉํ๋๋ฐ์.
ํด๋์ค ์ ์์ฒ๋ผ ํ์ผ ์์ค์ธ ๋ฌธ์ฅ์ ๋ค์ฌ์ฐ์ง ์๊ณ ํด๋์ค ๋ด ๋ฉ์๋๋ ํด๋์ค๋ณด๋ค ํ ์์ค ๋ค์ฌ์๋๋ค.
๋ฉ์๋ ์ฝ๋๋ ๋ฉ์๋ ์ ์ธ๋ณด๋ค ํ ์์ค ๋ค์ฌ์ฐ๊ณ ๋ธ๋ก ์ฝ๋๋ ๋ธ๋ก์ ํฌํจํ๋ ์ฝ๋๋ณด๋ค ํ ์์ค ๋ค์ฌ์๋๋ค.
๋ง์ฝ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ์๋ค๋ฉด ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ณด์ผ ๊ฒ ์ ๋๋ค.
func solution(_ places:[[String]]) -> [Int] { var answer:[Int] = [] for place in
places { var check:Bool = false var applicants:[Seat] = [] var xMap:[[String]] = []
getSeatLocation(places: place,xMap: &xMap,applicants: &applicants) outer:while
!applicants.isEmpty { let first = applicants.removeFirst() for applicant in applicants
{ if getManhattanDistance(p1: first, p2: applicant) <= 2 { if !isKeepDistance(p1: first,
p2: applicant,xMap: &xMap) { answer.append(0) check = true break outer } } } } if !check
{ answer.append(1) } } return answer } func getSeatLocation(places:[String],
xMap:inout [[String]],applicants:inout [Seat]) { for (y,place) in places.enumerated() {
xMap.append(place.map{String($0)}) for (x,p) in place.map({String($0)}).enumerated() {
if p == "P" { applicants.append((x,y)) } } } } func getManhattanDistance(p1:Seat,p2:Seat
) -> Int { return abs(p1.0-p2.0) + abs(p1.1-p2.1) } func isKeepDistance(p1:Seat,p2:Seat,
xMap:inout [[String]]) -> Bool { let minX = p1.0 < p2.0 ? p1 : p2 let minY = p1.1 < p2.1
? p1 : p2 if p1.0 == p2.0 { return xMap[minY.1+1][p1.0] == "X" }else if p1.1 == p2.1 {
return xMap[p1.1][minX.0+1] == "X" }else { if p1.0 < p2.0 { return xMap[p1.1][p1.0+1] ==
"X" && xMap[p2.1][p2.0-1] == "X" }else { return xMap[p2.1][p2.0+1] == "X" && xMap[p1.1][
p1.0-1] == "X" } } }
๊ฐ๋ ๊ฐ๋จํ if๋ฌธ,while๋ฌธ ๋ฑ ์งง์ ํจ์์์ ์๋์ ๊ฐ์ด ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ๋ฌด์ํ๊ณ ์ถ์ ์๊ตฌ๊ฐ ์๊น๋๋ค. (์ ๋ํ ๋ง์ด ๊ทธ๋ฌ์..)
ํ์ง๋ง ์ด๋ฌํ ์ฌ์ํ ๊ฒ๋ ๋ค์ฌ์ฐ๊ธฐ ๋ฒ์๋ก ์ ๋๋ก ํํํด์ผ ํฉ๋๋ค.
๋์ ์ โ
for i in 0...5 {
if i == 0 { continue }
}
์ข์ ์ ๐๐ป
for i in 0...5 {
if i == 0 {
continue
}
}
๋๊ธ