Updated:


시작하며

[백준 단계별 문제풀기 - for문] 에서 껄끄러웠던 문제 중 두번째인 X보다 작은 수 문제를 풀어보도록 하겠다.


백준 10871번

백준 10871번

이번 문제는 첫번째 줄에 N과 X를 입력받고, 두번째 줄의 N개의 숫자들 중에서 X보다 작은 수를 출력해야 한다.


let NX = readLine()!.split(separator: " ").map{Int($0)!}
let data = readLine()!.split(separator: " ").map{Int($0)!}
var output = ""
var check = false	// 숫자들을 한칸씩 띄우기 위한 식별자

// N개의 수 만큼 반복
for i in 0..<NX[0] {
	  // X보다 작은지 비교
    if data[i] < NX[1] {
		// check가 true일 경우 output에 첫번째 수가 들어간것이므로 공백을 넣어줌
        if check == true {
            output += " "
        }
		// 처음으로 X보다 작은 수는 check가 false이므로 공백없이 output에 가장 첫 문자로 들어감
	else {
            check = true
        }
        output += "\(data[i])"
    }
}
print(output)


#=> if input 10 5 and 1 10 4 9 2 3 8 5 7 6,
#=> prints      1 4 2 3

for문과 2개의 if문을 이용해 N개의 숫자들을 순차적으로 X와 비교하고 X보다 작은 수는 output변수에 공백으로 구분하여 입력해주었다.

(1) 첫번째 for문

  • NX[0] = N 이므로 N개의 수를 비교하기 위해 N번 반복되도록 함
  • 반복되는 지역변수(i)는 0부터 시작

(2) 첫번째 if문

  • NX[1] = X 이므로 data[i]와 비교해 작은지 아닌지 판별함
  • X보다 작을 경우 output변수에 입력

(3) 두번째 if문

  • 식별자를 통해 첫번째로 X보다 작은 수인지 아닌지 판별함
  • 첫번째로 X보다 작은 수일 경우 check = false 이므로 output변수에 공백 없이 가장 먼저 입력됨
  • 두번째로 X보다 작은 수 부터는 check = true 이므로 output변수에 공백이 먼저 들어간 후 숫자가 입력됨

Ex) 첫번째로 X보다 작은 수일 경우
output = "1"
두번째로 X보다 작은 수일 경우
output = "1 4"

따라서 예시와 같이 입력되었을 경우, 5보다 낮은 수들은 공백으로 구분되어 입력되게 된다.

이번 문제는 X보다 작은 수를 구분하는 방법보다 X보다 작은 수를 공백으로 구분해서 output변수에 할당하는 방법을 찾는 것이 더욱 까다로운 과정이였다고 느껴졌다.





마무리

이문제까지 [백준 단계별 문제풀기 - for문]의 문제들을 모두 풀어보았다. 아직까지 쉬운 문제들이고 이미 풀어보았던 문제들이였기 때문에 다시 풀어보는데 지장은 없었지만, 이미 풀어본 문제를 다시 풀어보니 새로운 방법을 찾게되고 더 간단하거나 효율적인 방법을 찾을 수 있던것 같다. 다음 while문 문제들부터는 난이도가 올라가니 더 나은방법들을 찾아 문제를 풀어보도록 해야겠다.