문제
https://www.acmicpc.net/problem/1152
입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열은 공백으로 시작하거나 끝날 수 있다.
출력
첫째 줄에 단어의 개수를 출력한다.
문제 풀이
문제 해석 및 계획
공백을 기준으로 문장을 나누어 개수를 확인하여야겠다고 단순하게 생각하였습니다.
오답 노트
조건 없는 for문에 fmt.Fscan을 통하여 입력을 받고 줄 바꿈을 처리하면 되겠다고 생각하였습니다.
줄 바꿈만 인식하는 방법을 생각해내지 못하여 막히게 되었습니다.
정답
package main
import (
"bufio"
"fmt"
"os"
)
func main(){
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var answer int
s,_ := reader.ReadBytes('\n')
check := true
for _,v := range s {
if v != 32 && check ==true && v != 13 && v != 10 {
check = false
answer++
}else if v == 32 {
check = true
}
}
fmt.Fprintln(writer, answer)
}
결국 여러 시행착오를 통하여 해결한 방법은 위와 같습니다.
'\n'까지 입력을 byte로 읽고 공백을 의미하는 32와 '\n'를 의미하는 13 10을 인식하지 않고 다른 값이 입력되면 단어 1개를 입력받은 것으로 처리하였습니다.
추가 풀이 (개인적으로 더 좋은 풀이)
package main
import (
"bufio"
"fmt"
"os"
"strings"
)
func main(){
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
s,_ := reader.ReadString('\n')
s = strings.TrimSpace(s)
stringSlice := strings.Split(s," ")
answer := len(stringSlice)
fmt.Fprintln(writer, answer)
}
byte로 입력을 받지 않고 'ReadString'을 통하여 '\n'까지 1줄을 문자열로 입력을 받고 앞과 뒤의 공백을 'TrimSpace'를 통하여 제거합니다.
그 후 'Split'을 통하여 공백을 기준으로 문자열을 나누어 slice로 반환합니다.
반환된 slice의 길이가 답이 됩니다.
느낀 점
매번 fmt.Fscan으로만 입력을 처리하여 공백이 존재하는 입력을 처리하는 방법을 생각하지 않았습니다. 코딩테스트를 준비할 때 가장 위험한 상황을 접하였습니다. 낮은 티어의 문제였지만 기본기가 부족하여 발생하는 문제를 직접 경험하며 더욱 기본기를 위한 문제를 먼저 풀어야겠다고 다짐하게 된 문제였습니다.
그리고 방법이 생각나지 않는다고 포기하거나 답을 보지 않고 fmt가 가진 메서드와 bufio.Reader가 가진 메서드를 확인하며 다양한 시도를 먼저 하였기에 확실하게 기억하게 되었습니다.
정답을 맞히고 잊어버리는 공부가 아닌 경험하고 생각하는 공부를 하며 성장하도록 하겠습니다.
'알고리즘 > 백준' 카테고리의 다른 글
[Go] 백준 1052번 물병 (0) | 2023.09.09 |
---|---|
[Go] 백준 24511번 queuestack (queue) (0) | 2023.09.08 |
[Go] 백준 1005번 (위상 정렬, 깊이 우선 탐색) (0) | 2023.09.01 |
[Go] 백준 1004번 (Fscanln과 Fscan) (0) | 2023.08.30 |
[Go] 백준 1003번 (피보나치) (0) | 2023.08.29 |