해결된 질문
작성
·
271
·
수정됨
0
http://boj.kr/35d6f320e0d042ea9331b757b1e5bf15
안녕하세요 위 링크에 제가 작성한 코드가 있습니다.
일단 제가 알고리즘 문제를 풀어보는게 이 문제가 처음이라서, 문제에 제시된 조건을 코드에 어느정도로 적용해야 하는지 감이 안잡히는것 같아서 질문올립니다.
뭔소리냐면 예를 들어 이 일곱난쟁이 문제를 처음 딱 봤을때 저는,
"주어지는 키는 100을 넘지 않는 자연수"
"아홉 난쟁이의 키는 모두 다르며"
라는 두가지 입력 조건이 있다고 인식을 했고, 두 조건의 코드 구현에 대해 고민하는데에 1시간을 썼지만 결국 첫번째 조건에 대해서만 코드로 구현하는 데 성공했습니다.
if(a[i]<1 || a[i]>100){
cout << "1~100 사이의 수를 입력하세요!" << "\n";
a[i] = 0;
i--;
continue;
}
<< 이 부분이 첫번째 조건을 구현한 부분입니다.
"100을 넘지 않는 자연수" 이외의 숫자를 입력 시 경고문구와 함께 입력한 숫자가 없어지고 그 자리에 다시 입력하도록 하는 코드입니다.
(두번째 조건인 "입력 숫자는 중복이 불가"도 나름 고민을 해봤지만 도저히 컴파일 결과가 원하는 대로 안나와서 일단 그부분은 지우고 위의 링크 상태로 백준에 제출한 것입니다.)
컴파일 시 문제의 예제입력1을 넣으면 예제출력1과 동일하게 결과가 나오지만, 백준 결과는 틀렸다고 나왔습니다.
그래서 뭐가 틀렸나 강의와 모범답안을 확인해보니 제가 고민했던 조건 2가지에 대한 코드가 답안에는 아예 없더라구요?!
바로 이 부분에서 제가 혼란이 와서 질문드립니다ㅠ
제 생각엔 제시된 예제입력 외의 모든 상황에서도 결과가 똑바로 나와야 하기 때문에, 숫자 입력 시 -1이나 200같은 범위 외 숫자를 입력하거나 이미 입력한 숫자를 또 입력할 경우는 문제에 제시한 조건에 부합하지 않아 결과가 바르지 않으므로, 애초에 코드 짤때부터 이 모든 부분을 방지해야 한다고 생각을 했는데, 이런 생각 자체가 너무 깊게생각한걸까요?
앞으로 모든 문제에 있어서 이런 식으로 문제에서 구현 조건처럼 보이는 문구들이 있어도 전부 구현할 필요 없이 단순히 제공된 예제의 케이스만 바르게 나오도록 간소화해서 코드를 짜면 되는건지..그 조건 적용 범위나 기준이 암묵적으로 있는지 이런 것들이 궁금합니다. 확실히 이부분을 고려해서 코드를 짜냐 안짜냐가 소요 시간에 엄청난 영향을 끼치니까요ㅠㅠ
아, 그리고 추가로 이번 난쟁이의 경우처럼 제가 모범답안 외 추가적으로 작성한 코드에 의해 컴파일은 잘 되지만 백준 결과가 틀렸다고 나올 경우에 제가 작성한 부분을 뇌에서 지우고 그냥 모범답안으로 외워야 할까요? 아니면 해당 부분이 제 생각에 문제 논리를 거스르지는 않는 부분이라고 판단되면 그냥 제가 생각한 로직대로 기억해도 되는걸까요?
답변 1
0
안녕하세요 은진님 ㅎㅎ
제 생각엔 제시된 예제입력 외의 모든 상황에서도 결과가 똑바로 나와야 하기 때문에, 숫자 입력 시 -1이나 200같은 범위 외 숫자를 입력하거나 이미 입력한 숫자를 또 입력할 경우는 문제에 제시한 조건에 부합하지 않아 결과가 바르지 않으므로, 애초에 코드 짤때부터 이 모든 부분을 방지해야 한다고 생각을 했는데, 이런 생각 자체가 너무 깊게생각한걸까요?
>> 네 조금은 깊어요 ㅎㅎ 문제에서 입력이 주어질 때 해당 입력에 대한 범위체크로직. 즉,
if(a[i]<1 || a[i]>100){
앞의 코드는필요하지 않습니다.
앞으로 모든 문제에 있어서 이런 식으로 문제에서 구현 조건처럼 보이는 문구들이 있어도 전부 구현할 필요 없이 단순히 제공된 예제의 케이스만 바르게 나오도록 간소화해서 코드를 짜면 되는건지..그 조건 적용 범위나 기준이 암묵적으로 있는지 이런 것들이 궁금합니다. 확실히 이부분을 고려해서 코드를 짜냐 안짜냐가 소요 시간에 엄청난 영향을 끼치니까요ㅠㅠ
>> 네 맞습니다. 좀 더 정확히 말씀을 드리면 제공된 예제 + 이런 ~~ 케이스는되지 않을까? 하는 케이스를 스스로 생각해서 해당 케이스에 맞춰 해당 출력결과가 나오게끔 구축하시면 됩니다.
아, 그리고 추가로 이번 난쟁이의 경우처럼 제가 모범답안 외 추가적으로 작성한 코드에 의해 컴파일은 잘 되지만 백준 결과가 틀렸다고 나올 경우에 제가 작성한 부분을 뇌에서 지우고 그냥 모범답안으로 외워야 할까요? 아니면 해당 부분이 제 생각에 문제 논리를 거스르지는 않는 부분이라고 판단되면 그냥 제가 생각한 로직대로 기억해도 되는걸까요?
>> 꼭 모범답안을 외울 필요는 없습니다. 음... 은진님의 논리가 맞다고 생각하고 예제출력도 올바르게 나오는데 제출했을 때 틀리면 그걸 맞왜틀이라고 하는데요. 이 때는 제게 질문주시면 됩니다. 그러면서 최대한 모범답안은 참고하시면서 공부하시면 되구요.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제가 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.