⌨️ Language/swift

[Swift] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 바탕화면 정리

hyebin (Helia) 2023. 3. 19. 13:30
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

바탕화면 정리

문제 μ„€λͺ…

μ½”λ”©ν…ŒμŠ€νŠΈλ₯Ό μ€€λΉ„ν•˜λŠ” λ¨Έμ“±μ΄λŠ” ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—μ„œ 문제λ₯Ό ν’€κ³  λ‚˜μ€‘μ— λ‹€μ‹œ μ½”λ“œλ₯Ό λ³΄λ©΄μ„œ κ³΅λΆ€ν•˜λ €κ³  μž‘μ„±ν•œ μ½”λ“œλ₯Ό 컴퓨터 바탕화면에 아무 μœ„μΉ˜μ—λ‚˜ μ €μž₯ν•΄ λ‘‘λ‹ˆλ‹€. μ €μž₯ν•œ μ½”λ“œκ°€ λ§Žμ•„μ§€λ©΄μ„œ λ¨Έμ“±μ΄λŠ” 본인의 컴퓨터 바탕화면이 λ„ˆλ¬΄ μ§€μ €λΆ„ν•˜λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ—μ„œ μž‘μ„±ν–ˆλ˜ μ½”λ“œλŠ” κ·Έ λ¬Έμ œμ— κ°€μ„œ λ‹€μ‹œ λ³Ό 수 있기 λ•Œλ¬Έμ— μ €μž₯ν•΄ λ‘” νŒŒμΌλ“€μ„ μ „λΆ€ μ‚­μ œν•˜κΈ°λ‘œ ν–ˆμŠ΅λ‹ˆλ‹€.

 

컴퓨터 바탕화면은 각 칸이 μ •μ‚¬κ°ν˜•μΈ κ²©μžνŒμž…λ‹ˆλ‹€. μ΄λ•Œ 컴퓨터 λ°”νƒ•ν™”λ©΄μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚Έ λ¬Έμžμ—΄ λ°°μ—΄ wallpaperκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. νŒŒμΌλ“€μ€ λ°”νƒ•ν™”λ©΄μ˜ κ²©μžμΉΈμ— μœ„μΉ˜ν•˜κ³  λ°”νƒ•ν™”λ©΄μ˜ κ²©μžμ λ“€μ€ λ°”νƒ•ν™”λ©΄μ˜ κ°€μž₯ μ™Όμͺ½ μœ„λ₯Ό (0, 0)으둜 μ‹œμž‘ν•΄ (μ„Έλ‘œ μ’Œν‘œ, κ°€λ‘œ μ’Œν‘œ)둜 ν‘œν˜„ν•©λ‹ˆλ‹€. λΉˆμΉΈμ€ ".", 파일이 μžˆλŠ” 칸은 "#"의 값을 κ°€μ§‘λ‹ˆλ‹€. λ“œλž˜κ·Έλ₯Ό ν•˜λ©΄ νŒŒμΌλ“€μ„ 선택할 수 있고, μ„ νƒλœ νŒŒμΌλ“€μ„ μ‚­μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¨Έμ“±μ΄λŠ” μ΅œμ†Œν•œμ˜ 이동거리λ₯Ό κ°–λŠ” ν•œ 번의 λ“œλž˜κ·Έλ‘œ λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•΄μ„œ ν•œ λ²ˆμ— μ§€μš°λ €κ³  ν•˜λ©° λ“œλž˜κ·Έλ‘œ νŒŒμΌλ“€μ„ μ„ νƒν•˜λŠ” 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ“œλž˜κ·ΈλŠ” λ°”νƒ•ν™”λ©΄μ˜ 격자점 S(lux, luy)λ₯Ό 마우슀 μ™Όμͺ½ λ²„νŠΌμœΌλ‘œ ν΄λ¦­ν•œ μƒνƒœλ‘œ 격자점 E(rdx, rdy)둜 μ΄λ™ν•œ λ’€ 마우슀 μ™Όμͺ½ λ²„νŠΌμ„ λ–ΌλŠ” ν–‰λ™μž…λ‹ˆλ‹€. μ΄λ•Œ, "점 Sμ—μ„œ 점 E둜 λ“œλž˜κ·Έν•œλ‹€"라고 ν‘œν˜„ν•˜κ³  점 S와 점 Eλ₯Ό 각각 λ“œλž˜κ·Έμ˜ μ‹œμž‘μ , 끝점이라고 ν‘œν˜„ν•©λ‹ˆλ‹€.
  • 점 S(lux, luy)μ—μ„œ 점 E(rdx, rdy)둜 λ“œλž˜κ·Έλ₯Ό ν•  λ•Œ, "λ“œλž˜κ·Έ ν•œ 거리"λŠ” |rdx - lux| + |rdy - luy|둜 μ •μ˜ν•©λ‹ˆλ‹€.
  • 점 Sμ—μ„œ 점 E둜 λ“œλž˜κ·Έλ₯Ό ν•˜λ©΄ λ°”νƒ•ν™”λ©΄μ—μ„œ 두 κ²©μžμ μ„ 각각 μ™Όμͺ½ μœ„, 였λ₯Έμͺ½ μ•„λž˜λ‘œ ν•˜λŠ” μ§μ‚¬κ°ν˜• 내뢀에 μžˆλŠ” λͺ¨λ“  파일이 μ„ νƒλ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ wallpaper = [".#...", "..#..", "...#."]인 λ°”탕화면을 κ·Έλ¦ΌμœΌλ‘œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ λ°”νƒ•ν™”λ©΄μ—μ„œ λ‹€μŒ κ·Έλ¦Όκ³Ό κ°™μ΄ S(0, 1)μ—μ„œ E(3, 4)둜 λ“œλž˜κ·Έν•˜λ©΄ μ„Έ κ°œμ˜ νŒŒμΌμ΄ λͺ¨λ‘ μ„ νƒλ˜λ―€λ‘œ λ“œλž˜κ·Έ ν•œ κ±°λ¦¬ (3 - 0) + (4 - 1) = 6을 μ΅œμ†Ÿκ°’μœΌλ‘œ λͺ¨λ“  νŒŒμΌμ„ μ„ νƒ κ°€λŠ₯ν•©λ‹ˆλ‹€.

(0, 0)μ—μ„œ (3, 5)둜 λ“œλž˜κ·Έν•΄λ„ λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•  μˆ˜ μžˆμ§€λ§Œ μ΄λ•Œ λ“œλž˜κ·Έ ν•œ κ±°λ¦¬λŠ” (3 - 0) + (5 - 0) = 8이고 μ΄μ „μ˜ λ°©λ²•보닀 κ±°λ¦¬κ°€ λŠ˜μ–΄λ‚©λ‹ˆλ‹€.

λ¨Έμ“±μ΄μ˜ μ»΄ν“¨ν„° λ°”νƒ•ν™”λ©΄μ˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄ λ°°μ—΄ wallpaperκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ λ°”νƒ•ν™”λ©΄μ˜ νŒŒμΌλ“€μ„ ν•œ λ²ˆμ— μ‚­μ œν•˜κΈ° μœ„ν•΄ μ΅œμ†Œν•œμ˜ μ΄λ™κ±°λ¦¬λ₯Ό κ°–λŠ” λ“œλž˜κ·Έμ˜ μ‹œμž‘점과 λμ μ„ λ‹΄μ€ μ •μˆ˜ λ°°μ—΄μ„ return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μž‘μ„±ν•΄ μ£Όμ„Έμš”. λ“œλž˜κ·Έμ˜ μ‹œμž‘점이 (lux, luy), λμ μ΄ (rdx, rdy)라면 μ •μˆ˜ λ°°μ—΄ [lux, luy, rdx, rdy]λ₯Ό return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ œν•œ 사항

  • 1 ≤ wallpaper의 길이 ≤ 50
  • 1 ≤ wallpaper[i]의 길이 ≤ 50
    • wallpaper의 λͺ¨λ“  μ›μ†Œμ˜ κΈΈμ΄λŠ” λ™μΌν•©λ‹ˆλ‹€.
  • wallpaper[i][j]λŠ” λ°”νƒ•ν™”λ©΄μ—μ„œ i + 1ν–‰ j + 1열에 ν•΄λ‹Ήν•˜λŠ” 칸의 μƒνƒœλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • wallpaper[i][j]λŠ” "#" λ˜λŠ” "."의 κ°’λ§Œ κ°€μ§‘λ‹ˆλ‹€.
  • λ°”νƒ•ν™”λ©΄μ—λŠ” 적어도 ν•˜λ‚˜μ˜ 파일이 μžˆμŠ΅λ‹ˆλ‹€.
  • λ“œλž˜κ·Έ μ‹œμž‘μ  (lux, luy)와 끝점 (rdx, rdy)λŠ” lux < rdx, luy < rdyλ₯Ό λ§Œμ‘±ν•΄μ•Ό ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

wallpaper result
[".#...", "..#..", "...#."] [0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."] [1, 3, 5, 8]
[".##...##.", "#..#.#..#", "#...#...#", ".#.....#.", "..#...#..", "...#.#...", "....#...."] [0, 0, 7, 9]
["..", "#."] [1, 0, 2, 1]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 문제 μ„€λͺ…μ˜ μ˜ˆμ‹œμ™€ 같은 μ˜ˆμ œμž…λ‹ˆλ‹€. (0, 1)μ—μ„œ (3, 4)둜 λ“œλž˜κ·Έν•˜λ©΄ λͺ¨λ“  νŒŒμΌμ„ 선택할 수 있고 λ“œλž˜κ·Έ ν•œ κ±°λ¦¬λŠ” 6μ΄μ—ˆκ³ , 6보닀 적은 거리둜 λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•˜λŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ [0, 1, 3, 4]λ₯Ό return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • 예제 2번의 바탕화면은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • (1, 3)μ—μ„œ (5, 8)둜 λ“œλž˜κ·Έν•˜λ©΄ λͺ¨λ“  νŒŒμΌμ„ 선택할 수 있고 이보닀 적은 μ΄λ™κ±°λ¦¬λ‘œ λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•˜λŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ κ°€μž₯ 적은 μ΄λ™μ˜ λ“œλž˜κ·Έλ‘œ λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•˜λŠ” 방법인 [1, 3, 5, 8]을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • 예제 3번의 λ°”탕화면은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λͺ¨λ“  νŒŒμΌμ„ μ„ νƒν•˜κΈ° μœ„ν•΄μ„  λ°”νƒ•ν™”λ©΄μ˜ κ°€μž₯ μ™Όμͺ½ μœ„ (0, 0)μ—μ„œ κ°€μž₯ 였λ₯Έμͺ½ μ•„λž˜ (7, 9)둜 λ“œλž˜κ·Έν•΄μ•Όλ§Œ ν•©λ‹ˆλ‹€. λ”°λΌμ„œ [0, 0, 7, 9]λ₯Ό return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #4

  • 예제 4번의 λ°”탕화면은 λ‹€μŒκ³Ό κ°™μ΄ 2ν–‰ 1μ—΄μ—λ§Œ μ•„μ΄μ½˜μ΄ μžˆμŠ΅λ‹ˆλ‹€.

  • 이λ₯Ό λ“œλž˜κ·Έλ‘œ μ„ νƒν•˜κΈ° μœ„ν•΄μ„œλŠ” κ·Έ μΉΈμ˜ μ™Όμͺ½ μœ„ (1, 0)μ—μ„œ μ˜€λ₯Έμͺ½ μ•„λž˜ (2, 1)둜 λ“œλž˜κ·Έν•˜λ©΄ λ©λ‹ˆλ‹€. (1, 0)μ—μ„œ (2, 2)둜 λ“œλž˜κ·Έν•΄λ„ μ•„μ΄μ½˜μ„ μ„ νƒν•  μˆ˜ μžˆμ§€λ§Œ μ΄μ „보닀 μ΄λ™κ±°λ¦¬κ°€ λŠ˜μ–΄λ‚©λ‹ˆλ‹€. λ”°λΌμ„œ [1, 0, 2, 1]을 return ν•©λ‹ˆλ‹€.

제좜

import Foundation

func solution(_ wallpaper:[String]) -> [Int] {
    var x_arr = [Int]()
    var y_arr = [Int]()

    for (i, paper) in wallpaper.enumerated() {
        if paper.contains("#"){
            for (index, w) in paper.map{String($0)}.enumerated(){
                if w == "#" {
                    x_arr.append(i)
                    y_arr.append(index)
                }
            }
        }
    }

    return [x_arr.min() ?? 0, y_arr.min() ?? 0, x_arr.max()!+1, y_arr.max()!+1]
}
wallpaper λ°°μ—΄μ˜ 열에 "#"이 μžˆλŠ” κ²½μš°μ—λ§Œ μ•ˆμͺ½ for문을 μ‹€ν–‰ν•œλ‹€.
x_arrμ—λŠ” 열을 λ‚˜νƒ€λ‚΄λŠ” i의 값을 μ €μž₯ν•˜κ³ , y_arrμ—λŠ” 행을 λ‚˜νƒ€λ‚΄λŠ” index값을 μ €μž₯ν•œλ‹€.
x_arrμ—μ„œ κ°€μž₯ μž‘μ€ κ°’κ³Ό y_arrμ—μ„œ κ°€μž₯ μž‘μ€ κ°’, x_arrμ—μ„œ κ°€μž₯ 큰 κ°’+1, y_arrμ—μ„œ κ°€μž₯ 큰 κ°’+1을 배열에 λ‹΄μ•„ λ°˜ν™˜ν•œλ‹€.
(각 배열에 값이 μ—†λ‹€λ©΄ 0을 λ‹΄μ•„ λ°˜ν™˜ν•œλ‹€.)
 

 

λ°˜μ‘ν˜•