문제 풀이를 할 때 마다 계속 추가됩니다.
cmd + F 를 통해 문제번호 찾기를 추천드립니다.
22.03.24 업데이트
22.03.27 업데이트
22.03.29 업데이트
22.03.30 업데이트
22.04.04 업데이트
22.04.05 업데이트
아래 깃허브 주소에서 모든 백준 문제풀이를 확인하실 수 있습니다.
https://github.com/SuminPark-developer/BaekJoonPS
GitHub - SuminPark-developer/BaekJoonPS: 백준 Swift PS
백준 Swift PS. Contribute to SuminPark-developer/BaekJoonPS development by creating an account on GitHub.
github.com
백준 Swift 1743번(DFS)
// MARK: - 1743번(DFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M, K) = (input[0], input[1], input[2])
var board = Array(repeating: Array(repeating: ".", count: M + 1), count: N + 1)
var visited = Array(repeating: Array(repeating: false, count: M + 1), count: N + 1)
for _ in 0..<K {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r, c) = (input[0], input[1])
board[r][c] = "#" // 음식물 표시.
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func isValidCoord(_ y: Int, _ x: Int) -> Bool { // board 밖으로 안나가야됨.
return (1 <= y && y <= N) && (1 <= x && x <= M)
}
var count: Int = 0
var temp: [Int] = []
func dfs(_ y: Int, _ x: Int) {
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == "#" {
visited[ny][nx] = true
count += 1
dfs(ny, nx)
}
}
}
for y in 1...N {
for x in 1...M {
if !visited[y][x] && board[y][x] == "#" {
visited[y][x] = true
count = 1 // 방문한거로 되면서, 음식물 크기 1부터 시작.
dfs(y, x)
temp.append(count)
}
}
}
print(temp.max()!)
백준 Swift 1743번(BFS)
// MARK: - 1743번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, M, K) = (input[0], input[1], input[2])
var board = Array(repeating: Array(repeating: ".", count: M + 1), count: N + 1)
var visited = Array(repeating: Array(repeating: false, count: M + 1), count: N + 1)
for _ in 0..<K {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r, c) = (input[0], input[1])
board[r][c] = "#"
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (1 <= y && y <= N) && (1 <= x && x <= M)
}
func bfs(_ startY: Int, _ startX: Int) -> Int {
visited[startY][startX] = true
var count: Int = 1
let q = Dequeue([(startY, startX)])
while !q.isEmpty {
let (y, x) = q.popFirst()
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == "#" {
visited[ny][nx] = true
count += 1
q.pushLast((ny, nx))
}
}
}
return count
}
var temp: [Int] = []
for y in 1...N {
for x in 1...M {
if !visited[y][x] && board[y][x] == "#" {
visited[y][x] = true
let count = bfs(y, x)
temp.append(count)
}
}
}
print(temp.max()!)
백준 Swift 2667번(DFS)
// MARK: - 2667번(DFS)
let N = Int(readLine()!)!
var board: [[Int]] = []
var visited = Array(repeating: Array(repeating: false, count: N), count: N)
for _ in 0..<N {
let input = readLine()!.map{Int(String($0))!}
board.append(input)
}
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < N) && (0 <= x && x < N)
}
var count: Int = 0
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func dfs(_ y: Int, _ x: Int) {
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == 1 {
visited[ny][nx] = true
count += 1
dfs(ny, nx)
}
}
}
var temp: [Int] = []
for y in 0..<N {
for x in 0..<N {
if !visited[y][x] && board[y][x] == 1 {
count = 1
visited[y][x] = true
dfs(y, x)
temp.append(count)
}
}
}
temp.sort(by: <)
print(temp.count)
for num in temp {
print(num)
}
백준 Swift 2667번(BFS)
// MARK: - 2667번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let N = Int(readLine()!)!
var board: [[Int]] = []
var visited = Array(repeating: Array(repeating: false, count: N), count: N)
for _ in 0..<N {
let input = readLine()!.map{Int(String($0))!}
board.append(input)
}
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < N) && (0 <= x && x < N)
}
var count: Int = 0
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func bfs(_ startY: Int, _ startX: Int) -> Int {
visited[startY][startX] = true
let q = Dequeue([(startY, startX)])
count = 1
while !q.isEmpty {
let (y, x) = q.popFirst()
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == 1 {
visited[ny][nx] = true
count += 1
q.pushLast((ny, nx))
}
}
}
return count
}
var temp: [Int] = []
for y in 0..<N {
for x in 0..<N {
if !visited[y][x] && board[y][x] == 1 {
visited[y][x] = true
let count = bfs(y, x)
temp.append(count)
}
}
}
temp.sort(by: <)
print(temp.count)
for num in temp {
print(num)
}
백준 Swift 2583번(DFS)
// MARK: - 2583번(DFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (M, N, K) = (input[0], input[1], input[2])
var board = Array(repeating: Array(repeating: 0, count: N), count: M)
var visited = Array(repeating: Array(repeating: false, count: N), count: M)
for _ in 0..<K {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (x1, y1, x2, y2) = (input[0], input[1], input[2], input[3])
for y in y1..<y2 { // 직사각형에 속하는 부분을 다 1처리.
for x in x1..<x2 {
board[y][x] = 1
}
}
}
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < M) && (0 <= x && x < N)
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
var count: Int = 0
func dfs(_ y: Int, _ x: Int) {
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == 0 {
visited[ny][nx] = true
count += 1
dfs(ny, nx)
}
}
}
var temp: [Int] = []
for y in 0..<M {
for x in 0..<N {
if !visited[y][x] && board[y][x] == 0 {
visited[y][x] = true
count = 1
dfs(y, x)
temp.append(count)
}
}
}
temp.sort(by: <)
print(temp.count)
print(temp.map{String($0)}.joined(separator: " "))
백준 Swift 2583번(BFS)
// MARK: - 2583번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (M, N, K) = (input[0], input[1], input[2])
var board = Array(repeating: Array(repeating: 0, count: N), count: M)
var visited = Array(repeating: Array(repeating: false, count: N), count: M)
for _ in 0..<K {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (x1, y1, x2, y2) = (input[0], input[1], input[2], input[3])
for y in y1..<y2 {
for x in x1..<x2 {
board[y][x] = 1
}
}
}
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < M) && (0 <= x && x < N)
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
var count: Int = 0
func bfs(_ startY: Int, _ startX: Int) -> Int {
visited[startY][startX] = true
count = 1
let q = Dequeue([(startY, startX)])
while !q.isEmpty {
let (y, x) = q.popFirst()
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] == 0 {
visited[ny][nx] = true
count += 1
q.pushLast((ny, nx))
}
}
}
return count
}
var temp: [Int] = []
for y in 0..<M {
for x in 0..<N {
if !visited[y][x] && board[y][x] == 0 {
visited[y][x] = true
let area = bfs(y, x)
temp.append(area)
}
}
}
temp.sort(by: <)
print(temp.count)
print(temp.map{String($0)}.joined(separator: " "))
백준 Swift 2468번(DFS)
// MARK: - 2468번(DFS)
let N = Int(readLine()!)!
var board: [[Int]] = []
var visited = Array(repeating: Array(repeating: false, count: N), count: N)
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
board.append(input)
}
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < N) && (0 <= x && x < N)
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func dfs(_ y: Int, _ x: Int, _ standardHeight: Int) {
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && (board[ny][nx] > standardHeight) {
visited[ny][nx] = true
dfs(ny, nx, standardHeight)
}
}
}
var area: [Int] = []
let maxHeight = board.flatMap{$0}.max()! // 기준점 - 제일 높은곳까지
for height in 0...maxHeight { // 비가 안 올 때부터 ~ 비가 최대로 올 때까지.
visited = Array(repeating: Array(repeating: false, count: N), count: N) // 매 기준점마다, 방문기록 초기화.
var count: Int = 0 // 영역 카운팅
for y in 0..<N {
for x in 0..<N {
if !visited[y][x] && board[y][x] > height {
visited[y][x] = true
count += 1
dfs(y, x, height)
}
}
}
area.append(count)
}
print(area.max()!)
백준 Swift 2468번(BFS)
// MARK: - 2468번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let N = Int(readLine()!)!
var board: [[Int]] = []
var visited = Array(repeating: Array(repeating: false, count: N), count: N)
for _ in 0..<N {
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
board.append(input)
}
let dy = [0, 1, 0, -1]
let dx = [1, 0, -1, 0]
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < N) && (0 <= x && x < N)
}
func bfs(_ startY: Int, _ startX: Int, _ standardHeight: Int) {
visited[startY][startX] = true
let q = Dequeue([(startY, startX)])
while !q.isEmpty {
let (y, x) = q.popFirst()
for k in 0..<4 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && !visited[ny][nx] && board[ny][nx] > standardHeight {
visited[ny][nx] = true
q.pushLast((ny, nx))
}
}
}
}
var area: [Int] = []
let maxHeight: Int = board.flatMap{$0}.max()!
for height in 0...maxHeight { // 비가 0부터, 최대높이까지 올 때.
visited = Array(repeating: Array(repeating: false, count: N), count: N) // 방문기록 초기화.
var count: Int = 0
for y in 0..<N {
for x in 0..<N {
if !visited[y][x] && board[y][x] > height { // 방문기록 없고, 안전할 시
visited[y][x] = true
count += 1
bfs(y, x, height)
}
}
}
area.append(count)
}
print(area.max()!)
백준 Swift 7562번
문제 유형 : BFS
난이도 : 실버1
// MARK: - 7562번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let T = Int(readLine()!)!
let dx = [1, 2, 2, 1, -1, -2, -2, -1]
let dy = [2, 1, -1, -2, -2, -1, 1, 2]
for _ in 0..<T {
let l = Int(readLine()!)!
var board = Array(repeating: Array(repeating: 0, count: l), count: l)
var visited = Array(repeating: Array(repeating: -1, count: l), count: l)
var input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (stX, stY) = (input[0], input[1])
input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (endX, endY) = (input[0], input[1])
board[stY][stX] = 1
board[endY][endX] = 2 // 임의로 2로 정함.
func isValidCoord(_ y: Int, _ x: Int) -> Bool {
return (0 <= y && y < l) && (0 <= x && x < l)
}
func isEscape(_ y: Int, _ x: Int) -> Bool {
return board[y][x] == 2 // board값이 (임의로 정한) 2일 때 탈출.
}
func bfs(_ startY: Int, _ startX: Int) -> Int {
let q = Dequeue([(startY, startX)])
visited[startY][startX] = 0
while !q.isEmpty {
let (y, x) = q.popFirst()
if isEscape(y, x) { // 목표에 도달하면,
return visited[y][x]
}
for k in 0..<8 {
let ny = y + dy[k]
let nx = x + dx[k]
if isValidCoord(ny, nx) && visited[ny][nx] == -1 && board[ny][nx] != 1 { // 유효 범위고, 방문한적이 없고, 시작지점이 아니면,
visited[ny][nx] = visited[y][x] + 1
q.pushLast((ny, nx))
}
}
}
return -1 // 불가능 시 -1 return.
}
let answer = bfs(stY, stX)
print(answer)
}
백준 Swift 1697번
문제 유형 : BFS 최단거리 - +1, -1은 상관 없는데 2배조건 때문에 dx를 쓰지 못하고, 각각을 if조건 처리해줌.
(+1,-1,*2 각각의 케이스를 모두 체크해야 하는 거기 때문에 else if로 하면 안됨!)
난이도 : 실버1
// MARK: - 1697번(BFS)
class Dequeue<T> {
var enQueue: [T]
var deQueue: [T] = []
var count: Int {
return enQueue.count + deQueue.count
}
var isEmpty: Bool {
return enQueue.isEmpty && deQueue.isEmpty
}
init(_ queue: [T]) {
enQueue = queue
}
func pushLast(_ element: T) {
enQueue.append(element)
}
func pushFirst(_ element: T) {
deQueue.append(element)
}
func popLast() -> T {
if enQueue.isEmpty {
enQueue = deQueue.reversed()
deQueue.removeAll()
}
return enQueue.popLast()!
}
func popFirst() -> T {
if deQueue.isEmpty {
deQueue = enQueue.reversed()
enQueue.removeAll()
}
return deQueue.popLast()!
}
}
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, K) = (input[0], input[1])
var board = Array(repeating: 0, count: 100001) // 0부터 100000까지.
var visited = Array(repeating: -1, count: 100001) // 0부터 100000까지.
func isValidCoord(_ x: Int) -> Bool {
return (0 <= x && x <= 100000)
}
func isEscape(_ x: Int) -> Bool { // 수빈이를 만나면 탈출.
return (x == K)
}
func bfs(_ startX: Int) -> Int {
let q = Dequeue([startX])
visited[startX] = 0 // 첫 위치 0으로 초기화.
while !q.isEmpty {
let x = q.popFirst()
if isEscape(x) { // 탈출 성공 시,
return visited[x]
}
if isValidCoord(x + 1) && board[x + 1] == 0 && visited[x + 1] == -1 { // x+1한게 유효한 범위고, x+1이 갈 수 있는 곳이고, 미방문한 곳이면,
visited[x+1] = visited[x] + 1
q.pushLast(x+1)
}
if isValidCoord(x - 1) && board[x - 1] == 0 && visited[x - 1] == -1 { // x-1한게 유효한 범위고, x-1이 갈 수 있는 곳이고, 미방문한 곳이면,
visited[x-1] = visited[x] + 1
q.pushLast(x-1)
}
if isValidCoord(2 * x) && board[2 * x] == 0 && visited[2 * x] == -1 { // 2*x한게 유효한 범위고, 2*x이 갈 수 있는 곳이고, 미방문한 곳이면,
visited[2*x] = visited[x] + 1
q.pushLast(2*x)
}
}
return -1
}
let answer = bfs(N)
print(answer)
백준 Swift 1182번
문제 유형 : 조합 or DFS
난이도 : 실버2
// MARK: - 1182번(DFS)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, S) = (input[0], input[1])
let numArray = readLine()!.split(separator: " ").map{Int(String($0))!}
var visited = Array(repeating: false, count: N)
//var sum: Int = 0
var count: Int = 0
//func dfs(_ startIndex: Int, _ depth: Int) { // ver1
//
// if sum == S && depth > 0 { // 부분수열의 합이 S일 때,
// count += 1
// }
//
// for k in startIndex..<N {
// if !visited[k] {
// visited[k] = true
// sum += numArray[k]
//
// dfs(k, depth + 1)
//
// sum -= numArray[k]
// visited[k] = false
// }
// }
//
//}
func dfs(_ startIndex: Int, _ depth: Int, _ sum: Int) { // ver2(개선)
if sum == S && depth > 0 { // 부분수열의 합이 S일 때,
count += 1
}
for k in startIndex..<N {
if !visited[k] {
visited[k] = true
dfs(k + 1, depth + 1, sum + numArray[k])
visited[k] = false
}
}
}
dfs(0, 0, 0)
print(count)
조합 - 속도 느림.
// MARK: - 1182번(조합)
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
let (N, S) = (input[0], input[1])
let nums = readLine()!.split(separator: " ").map{Int(String($0))!}
var count: Int = 0
func combi(_ nums: [Int], _ targetNum: Int) -> [[Int]] {
var result: [[Int]] = []
func combination(_ index: Int , _ nowCombi: [Int]) {
if nowCombi.count == targetNum {
result.append(nowCombi)
return
}
for i in index..<nums.count {
combination(i + 1, nowCombi + [nums[i]])
}
}
combination(0, [])
return result
}
for k in 1...N {
let numArray = combi(nums, k)
for nums in numArray {
if nums.reduce(0, +) == S {
count += 1
}
}
}
print(count)
백준 Swift 2512번
문제 유형 : 파라메트릭 서치, Binary Search(이진 탐색)
- 이진탐색문제를 처음 풀어봐서 그런지, 이 문제가 이진탐색을 활용해야 하는지조차 생각하지 못했다.
난이도 : 실버3
// MARK: - 2512번(Binary Search)
let N = Int(readLine()!)!
let moneyArray = readLine()!.split(separator: " ").map{Int(String($0))!}
let M = Int(readLine()!)!
var answerMax: Int = 0
var low = 0
var high = moneyArray.max()!
var middle = (low + high) / 2
func isPossible(_ middle: Int) -> Bool {
var sum: Int = 0
for money in moneyArray {
sum += min(money, middle)
}
return sum <= M
}
while low <= high { // Parametric Search & Binary Search
if isPossible(middle) { // 기준예산(middle)으로 충당이 가능하면,
low = middle + 1 // 기준예산보다 위로 다시 체크.
answerMax = middle
}
else { // 기준예산(middle)으로 충당이 불가능하면,
high = middle - 1 // 기준예산보다 밑으로 다시 체크.
}
middle = (low + high) / 2
}
print(answerMax)
더보기 - 개선전 코드
개선전 코드
// MARK: - 2512번(Binary Search)
let N = Int(readLine()!)!
let moneyArray = readLine()!.split(separator: " ").map{Int(String($0))!}
let M = Int(readLine()!)!
var answerMax: Int = 0
if moneyArray.reduce(0, +) <= M { // 모든 요청이 배정될 수 있는 경우,
answerMax = moneyArray.max()!
}
else { // 모든 요청이 배정될 수 없는 경우,
var start: Int = 0
var end: Int = moneyArray.max()!
var mid = (start + end) / 2
while start <= end {
var sum: Int = 0
mid = (start + end) / 2
for money in moneyArray {
sum += money > mid ? mid : money // money가 기준(중간값)보다 크면 기준을 더하고, 기준보다 작거나 같으면 money를 더함.
}
if sum > M {
end = mid - 1
}
else {
start = mid + 1
}
}
answerMax = end
}
print(answerMax) // 배정된 예산들 중 최댓값
백준 Swift 10815번
문제 유형 : 이분탐색(이진탐색)
난이도 : 실버4
// MARK: - 10815번(이진 탐색)
let N = Int(readLine()!)!
let sanggeunCards = readLine()!.split(separator: " ").map{Int(String($0))!}.sorted(by: <)
let M = Int(readLine()!)!
let checkCards = readLine()!.split(separator: " ").map{Int(String($0))!}
var answerArray = Array(repeating: "0", count: M)
for (index, card) in checkCards.enumerated() {
var lowIndex: Int = 0
var highIndex: Int = N - 1
while lowIndex <= highIndex { // 이진 탐색
let middleIndex: Int = (lowIndex + highIndex) / 2
if sanggeunCards[middleIndex] == card {
answerArray[index] = "1"
break
}
if sanggeunCards[middleIndex] < card {
lowIndex = middleIndex + 1
}
else {
highIndex = middleIndex - 1
}
}
}
print(answerArray.joined(separator: " "))
최근댓글