Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] ์ž…๋ ฅ ๋ฐ›๊ธฐ - readLine() ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์‚ดํŽด๋ณด๊ธฐ (feat.๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€ ๋•Œ ํ•„์ˆ˜)

๊ฐ์ž ๐Ÿฅ” 2022. 1. 30. 11:48
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š” ๊ฐ์ž์ž…๋‹ˆ๋‹ค! ์˜ค๋Š˜์€ swift ์–ธ์–ด์—์„œ ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์ธ readLine()์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฑฐ์—์š”. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„์ค‘์ธ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋Š” ๋‹ต์•ˆ์„ func๋กœ ์ž‘์„ฑํ•˜๋ฉฐ ๋˜์ง€๋งŒ, ๋ฐฑ์ค€์€ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋ชจ๋‘ ์ž…๋ ฅํ•ด์•ผํ•ด์š”! ๊ทธ๋ž˜์„œ ๋ฐฑ์ค€์œผ๋กœ ๊ณต๋ถ€ํ•  ๋•Œ ๊ฐ ์–ธ์–ด๋ณ„๋กœ input์„ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ตํžˆ๊ณ  ์žˆ๋Š”๊ฒƒ์ด ํ•„์ˆ˜์ธ๋ฐ์š”, 

์ž…๋ ฅ์„ ๊ทธ๋ƒฅ ์ˆ˜ ํ•˜๋‚˜๋งŒ ๋ฐ›๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ํ–‰๋ ฌ๋กœ ๋ฐ›๊ธฐ๋„ ํ•˜๊ณ , ๋ฐฐ์—ด๋กœ ๋ฐ›๊ธฐ๋„ํ•˜๊ณ , ์—ฌ๋Ÿฌ์ค„๋กœ ๋ฐ›๊ธฐ๋„ํ•˜๊ณ  ์ •๋ง ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ input์„ ๋ฐ›์ž–์•„์š”! ์ด๊ฒƒ์„ ๋ชจ๋‘ ์ตํ˜€๋†”์•ผ ๋‚˜์ค‘์— ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€๋•Œ ๋ง‰ํžˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•ด๋ณด๋„๋ก ํ• ๊ฒŒ์š”.

์‚ฌ์‹ค ์ œ๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์ œ๊ฐ€ ์™ธ์›Œ๋†“๊ธฐ(?) ์œ„ํ•ด์„œ ์ ๋Š”๊ฑฐ๋ž๋‹ˆ๋‹ค ํ—ˆํ—ˆ ๊ทธ๋Ÿผ go

 

readLine()

Swift์—์„œ ์ž…๋ ฅ์€ readLine()์„ ํ†ตํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋‹ค. readLine()์€ ์ž…๋ ฅ์„ ๋ชจ๋‘ optional Stringํ˜•์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋˜๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ Swfit์—์„œ readLine์€ EOF๊ฐ€ ๋“ค์–ด์˜ค๊ธฐ์ „์˜ ์ž…๋ ฅ์„ return ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, EOF๋ž€ End Of File ์˜ ๋œป์œผ๋กœ ์—”ํ„ฐ๊ฐ€ ์ž…๋ ฅ๋˜๋Š” ๊ฒƒ์„ EOF์ฒ˜๊ธฐ๊ฐ€ ๋๋‹ค~ ๋ผ๊ณ  ๋งํ•œ๋‹ค. ์ฆ‰, ์—”ํ„ฐ๊ฐ€ ํ•œ๋ฒˆ ์ž…๋ ฅ๋˜๋ฉด readLine() ํ•œ๊ฐœ๊ฐ€ ๋๋‚˜๋Š” ๊ฒƒ์ด๋‹ค. 

๋”ฐ๋ผ์„œ Swift์—์„œ๋Š” ์ž…๋ ฅ์„ ์—ฌ๋Ÿฌ์ค„ ๋ฐ›์„ ๋•Œ readLine()์„ ์—ฌ๋Ÿฌ๋ฒˆ ์จ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค! 

1. ์ •์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ

์•ž์„œ readLine์€ ๋ชจ๋“  ๊ฐ’์„ optional string์˜ ํ˜•ํƒœ๋กœ returnํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ, ์ •์ˆ˜ ์ž…๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ•์ œ๋กœ ์˜ต์…”๋„์„ ๋ฒ—๊ธฐ๋Š” ๊ธฐ๋Šฅ๊ณผ , INT๋กœ ํ˜•๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค.

let input = readLine()
print(type(of:input))
// prints "Optional<String>"

let inputOut = input!
print(type(of:inputOut))
//prints "String"

let intvar = Int(InputOut)
print(type(of:intvar))
//prints "Optional<Int>"

let result = intvar!
print(type(of:result))
//prints "Int"

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, readLine์œผ๋กœ ์ž…๋ ฅ๋ฐ›์€ input์€ optional string ๊ฐ’์ด๋‹ค. (string? ๊ฐ’)

๊ทธ๋ž˜์„œ ์ด๋ฅผ inputOut์˜ ๋ณ€์ˆ˜์— ์–ธ๋ž˜ํ•‘ํ•˜์—ฌ ์ €์žฅํ•˜์˜€๋”๋‹ˆ, ์ผ๋ฐ˜ Stringํ˜•์ด ์ถœ๋ ฅ๋œ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์‹œ ์ด๋ฅผ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ.

intvar ๋ณ€์ˆ˜์— Int() ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ˜•๋ณ€ํ™˜์„ ์‹œ๋„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ๋‹ค์‹œ Optional Int ๊ฐ’์œผ๋กœ ์ถœ๋ ฅ๋˜์—ˆ๊ณ , ์˜ต์…”๋„์ด ์–ธ๋ž˜ํ•‘ ๋˜์ง€ ์•Š์•˜๋‹ค. ์™œ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ์˜ต์…”๋„๋กœ ๋ž˜ํ•‘๋˜๋Š” ๊ฒƒ์ผ๊นŒ? ๊ทธ ์ด์œ ๋Š”, string์œผ๋กœ ์ž…๋ ฅ๋œ 1,2,3,4 ์™€ ๊ฐ™์€ ์ˆซ์ž๋“ค์€ int๋กœ ํ˜•๋ณ€ํ™˜์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋งŒ์•ฝ์— ์ž…๋ ฅ๋ฐ›์€ string์ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ a,b,c,d ์™€ ๊ฐ™์€ ๋ฌธ์ž๋ผ๋ฉด, int๋กœ ํ˜•๋ณ€ํ™˜์„ ์‹œ๋„ํ•˜๋ฉด nil์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์•ˆ์ „ํ•œ ์–ธ์–ด์ธ Swift๋Š” ์ด๋ฅผ ๋‹ค์‹œ ๋ž˜ํ•‘ํ•˜์—ฌ optional๋กœ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ •์ˆ˜๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งˆ์ง€๋ง‰์— ๋‹ค์‹œํ•œ๋ฒˆ ๊ฐ•์ œ๋กœ ์–ธ๋ž˜ํ•‘ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. (result๋ฅผ ๋ด๋ผ. ๋‹ค์‹œ ์–ธ๋ž˜ํ•‘ ํ•ด์ฃผ๋‹ˆ๊นŒ ์šฐ๋ฆฌ๊ฐ€ ์›ํ–ˆ๋˜ ์ •์ˆ˜ํ˜•์ด ๋“œ๋””์–ด ์ถœ๋ ฅ๋˜์—ˆ๋‹ค.)

์ด๋ฅผ ํ•œ๋ฒˆ์— ์ž…๋ ฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

let n = Int(readLine()!)!

 

2. ๋ฌธ์ž์—ด ํ•˜๋‚˜ ์ž…๋ ฅ ๋ฐ›๊ธฐ

์•ž์—์„œ ์ •์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์˜ต์…”๋„์„ ๋‘๋ฒˆ ๋ฒ—๊ฒจ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ฏธ string ํ˜•ํƒœ๋กœ ์ž…๋ ฅ์„ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด ํ•˜๋‚˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” readLine์— ์˜ต์…”๋„์„ ํ•œ๋ฒˆ๋งŒ ๊ฐ•์ œ๋กœ ๋ฒ—๊ฒจ์ฃผ๋ฉด ๋œ๋‹ค.

let text = readLine()!

 

3. ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž…๋ ฅ๋ฐ›๊ธฐ, ๋ฐ”๋กœ ๋ฐฐ์—ด๋กœ ์ž…๋ ฅ๋ฐ›๊ธฐ

import Foundation


let input = readLine()!  // h e l l o ๋ผ๊ณ  ์ž…๋ ฅ
print(type(of: input))
print(input)
// prints "String"
// prints "h e l l o"

let result = input.components(separatedBy: " ")
print(type(of: result))
print(result)
// prints "Array<String>"
// prints ["h", "e", "l", "l", "o"]

fountdation ํ”„๋ ˆ์ž„์›Œํฌ์— ํฌํ•จ๋˜์–ด์žˆ๋Š” components ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋„์–ด์“ฐ๊ธฐ๋กœ ๊ตฌ๋ถ„ํ•ด์ฃผ์—ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์“ฐ๊ฒŒ ๋˜๋ฉด ๋„์–ด์“ฐ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅ๋ฐ›์€ ๋ฌธ์ž์—ด์ด "๋ฐฐ์—ด" ๋กœ ๋ฐ”๋กœ return๋œ๋‹ค. ์œ ์šฉํ• ๊ฒƒ ๊ฐ™๋‹ค!

 

4. ๋„์–ด์“ฐ๊ธฐ๋กœ ์ •์ˆ˜ ์—ฌ๋Ÿฌ๊ฐœ ์ž…๋ ฅ ๋ฐ›๊ธฐ

์ •์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š”, split ๊ณผ map์„ ์ด์šฉํ•ด ์ค„๊ฒƒ์ด๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

let input = readLine()!.split(separator: " ").map { Int(String($0))! }
// ์ž…๋ ฅ: 1 2 3
// Array<Int>
// [1, 2, 3]

map() ๋ฉ”์„œ๋“œ๋ฅผ ํด๋กœ์ €๋กœ ์‚ฌ์šฉํ•œ ์ผ€์ด์Šค์ด๋‹ค. ๋ฐฐ์—ด ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์•„์ดํ…œ์— map ํด๋กœ์ € ์•ˆ์˜ ์ฝ”๋“œ๋ฅผ ์ ์šฉ์‹œํ‚จ๋‹ค๋Š” ๋œป์œผ๋กœ, ํ•˜๋‚˜ํ•˜๋‚˜ Int๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด ๋ฐฐ์—ด์— ๋งคํ•‘์‹œ์ผœ์ค€๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ํŽธํ•  ๊ฒƒ์ด๋‹ค.

 

5. (๋„์–ด์“ฐ๊ธฐ์—†์ด) ํ•œ ๋ฒˆ์— ์ž…๋ ฅ ๋ฐ›์•„์„œ ๋ฐฐ์—ด๋กœ returnํ•˜๊ธฐ

let input = Array(readLine()!) //์ž…๋ ฅ; hello
print(input)
print(type(of:input))

//prints ["h", "e", "l", "l", "o"]
// prints Array<String>

ํ”ํ•˜์ง„ ์•Š์ง€๋งŒ, ๊ฐ„ํ˜น ๋„์–ด์“ฐ๊ธฐ ์—†์ด ์ž…๋ ฅ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ ์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค. ์•Œ์•„์„œ ์ €์ ˆ๋กœ ํ•œ๊ธ€์ž์”ฉ ๋ฐฐ์—ด์˜ ํ•œ ์ธ๋ฑ์Šค์— ์ €์žฅํ•ด์ค€๋‹ค. ํŽธํ•œ๊ฒƒ ๊ฐ™๋‹ค. ์ด๋ฅผ intํ˜•์œผ๋กœ ์ž…๋ ฅ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•˜์ž.

let result = input.map { Int(String($0))! }
print(result)
print(type(of: result))

//prints [1,2,3,4,5]  ๋งŒ์•ฝ, ์ž…๋ ฅ์ด "12345" ์˜€๋‹ค๋ฉด ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅ,
//prints Array<Int>
๋ฐ˜์‘ํ˜•