본문 바로가기

Algorithm

백준 - 구구단

728x90

이거 문제는 쉬운데 .. 다시 한번 고차함수를 잘 써야겠다고 느낀 .. 그런 문제라서 정리함 (.. 우우 언제쯤 난 .. 어쩔. 하면 되잖아. ㅇㅋㅇㅋ.

 

문제

N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

입력

첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력

출력형식과 같게 N*1부터 N*9까지 출력한다.

 

소깡이 풀이 

import Foundation

let input = Int(readLine()!)!

for i in 1...9 {
    print("\(input) * \(i) = \(input * i)")
}

 

그리고 좀 더 생각을 해봤음 ..

(1...9).forEach {
    print("\(input) * \($0) = \(input * $0)")
}

 

오홀아 ..

그럼 여기서 드는 궁금증 .. for-in 과 forEach의 차이는 무엇인가. -> 반복자 사용방식의 차이 .. 라는데 

새로 포슷힝 하겠음 .. (아마도)

 

_

근데 이제 새로운 풀이가 있나?

저것보다 더 줄일 수 있나?

 

고민을 하다가 ..

누군가가 이런 답을 작성함 (나랑 뇌 좀 바꾸자.)

 

그 사람 왈 :

"print() 메서드를 여러번 반복하는 것은 성능상 좋지 않음. 그래서 가능한 적게 출력하는 것이 좋음. 문자열을 누적해서 print() 호출 한번으로 줄여보겠음"

 

🫠

좋겠다 .. 그런 뇌가 있어서 ..

 

아무튼 그래서 줄여보면, print( 이 안에서 모든 로직 처리를 다하면 돼 ~ ) 이건데 .. 하나씩 해보자?!

print(
    (1...9) // 1. 구구단의 범위를 지정하고
    .map { "\(input) * \($0) = \(input * $0)" } // 2. 그 범위를 하나씩 순회하면서 출력할 문자열을 map을 통해 원하는 계산을 수행 
    .joined(separator: "\n") // [String] 형태를 개행 단위로 합쳐서 String으로 반환 
)

그러면 print() 호출 한번만으로 출력할 수 있는 것을 알 수 있다.

.joined(separator:) 뭔데.

ㅇㅋㅇㅋ. 나도 어색함. ㅎ2

이 메서드는 separator 파라미터로 받은 "결합문자"로 배열의 문자열들을 하나로 연결한 문자열로 반환해주는 메서드이다.

 

print(
    (1...9)
    .map { "\(input) * \($0) = \(input * $0)" }
//    .joined(separator: "\n")
)

위의 코드에서 결합을 하지 않고 출력하면,

이렇게 출력이 되는데 이 각 문자열을 "\n"으로 결합해서 문자열로 반환하여

이렇게 출력할 수 있다.

 

 

'Algorithm' 카테고리의 다른 글

백준 - 1110번 (더하기 사이클)  (0) 2022.08.23
백준 - 10951번  (0) 2022.08.23
Set을 잘 쓰자.  (0) 2022.08.20
백준 - 입출력과 사칙연산  (0) 2022.08.17
프로그래머스 - 나머지가 1이 되는 수 찾기  (0) 2022.04.15