성장, 그 아름다운 향연
article thumbnail

 

www.acmicpc.net/problem/1159

 

1159번: 농구 경기

상근이는 농구의 세계에서 점차 영향력을 넓혀가고 있다. 처음에 그는 농구 경기를 좋아하는 사람이었다. 농구에 대한 열정은 그를 막을 수 없었고, 결국 상근이는 농구장을 청소하는 일을 시작

www.acmicpc.net

출저 : https://www.acmicpc.net/problem/1159

 


문자열을 공부하면서 부정확한 for문의 이해로 몇 번의 실패를 경험하게 됐다.

필자가 문제를 풀면서 헷갈렸던 점은

  • 1.for문의 'in' 다음으로 배열 혹은 collection을 선언하는 것
  • 배열 혹은 collection의 크기를 범위로 두는 것

 

처음에 문제를 풀 때는 첫 번째 방법으로 접근하려 했다.

<kotlin />
import java.io.* fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val n = br.readLine()!!.toInt() val cnt = IntArray(26) var isOk = false for(i in 0 until n) { val name = br.readLine() val first = name.first() cnt[first.toInt()-97]++ } for(j in cnt) { if(j >= 5) { print((cnt.indexOf(j)+97).toChar()) isOk = true } } if(!isOk) println("PREDAJA") br.close() }

 

이렇게 푼 이유는 cnt의 indexOf을 활용해서 해당 값을 출력하고자 했다. 5보다 같거나 큰 값을 찾아서 cnt 배열에 해당 값의 index + 97을 하면 원하는 값이 출력되니까 말이다.

 

하지만 문제에 나타나는 테스트 케이스를 다 성립함에도 불구하고 틀렸다고만 나왔다.

그래서 전체적으로 cnt 배열값이 어떤 결과가 나오는지 확인해봤다.

 

 

<kotlin />
for (j in cnt) { print("${(cnt.indexOf(j)+97).toChar()} ") }

 

결과 : a b a a a a a h a a k a a a a p a a p a a a a a a a

 

문제의 답은 b,k 인데 j가 5보다 큰 값이 b, k 에 있는 index이므로 언뜻 보면 그럴싸한 정답으로 보인다.

 

하지만 만약에 j의 값이 5개로 중복된다면, 값 또한 중복된 결과가 나올 수 있다는 것을 간파하지 못했다.

 

실제로 문제의 입력에서 조건을 거치면 b가 6개 나오고, k가 7개 나오므로 해당 로직을 구현했을 때 성공했다는 안일한 생각을 해버렸다.

 

 

그래서 다음과 같이 수정을 거치면서 정답을 찾게 됐다. 다음은 완성된 코드이다.

 

<kotlin />
import java.io.* fun main() { val br = BufferedReader(InputStreamReader(System.`in`)) val n = br.readLine()!!.toInt() val cnt = IntArray(26) var isOk = false for(i in 0 until n) { val name = br.readLine() val first = name.first() cnt[first.toInt()-97]++ } for(j in cnt.indices) { if(cnt[j]>=5) { print((j+97).toChar()) isOk = true } } if(!isOk) println("PREDAJA") br.close() }

 

 

막상 구현하고 나니 정말 간단한 접근법이였지만 테스트 케이스만 믿고 정답을 제출했던 일차적인 실수였다.

이번 문제를 계기로 문제의 테스트 케이스에 국한하지 않고, 다양한 경우의 수를 입력해서 정답에 접근할 수 있도록 더 노력해야 겠다.

profile

성장, 그 아름다운 향연

@dev_minoflower

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!