한민식
December 17, 2024, 12:48am
1
https://www.acmicpc.net/problem/10952
쉬운 PS 문제인데요.
숏코딩에 도전하고 있습니다.
가장 짧게 코드를 만들어야 합니다.
int a;while((a=Console.ReadLine().Split().Sum(int.Parse))!=0)Console.WriteLine(a);
이건 제가 가장 짧게 만들어 본 것입니다.
82글자 입니다.
그런데 1등 하신 분 보니까 72글자로 통과하셨더라구요.
뭔가 다른 방법이 있는 것 같은데
여러분들의 생각이 궁금합니다.
감사합니다.
2 Likes
루나시아
December 17, 2024, 5:49am
2
int a;while((a=Console.ReadLine().Sum(c=>c)-128)>0)Console.WriteLine(a);
아스키 코드에서 숫자 구간은, 실제 숫자에 48을 더한 값과 일치합니다. 예를 들어, char ‘1’(49)에서 48을 빼면 1이 됩니다.
또한 공백 문자는 아스키 코드표에서 32로 표현됩니다.
즉 문자열의 각 문자를 모두 더한 값에서 (48 * 2) + 32를 빼면 실제 숫자와 동일한 계산이 됩니다.
4 Likes
한민식
December 17, 2024, 6:27am
4
와… 바로 그것이었네요…
감탄했습니다!
답변 감사드립니다!!
2 Likes
한민식
December 17, 2024, 6:53am
5
for(int a;(a=Console.ReadLine().Sum(c=>c)-128)>0;Console.WriteLine(a));
for문으로 바꿔서 72에서 71로 줄일 수 있었습니다.
다시 한 번 감사드립니다!
3 Likes
tkm
December 18, 2024, 1:15am
6
제가 여기서 1글자 더 줄여보겠습니다.
for(int a;0<(a=Console.ReadLine().Sum(c=>c&15));Console.WriteLine(a));
5 Likes
dimohy
December 18, 2024, 2:47am
7
저는 여기서 더 줄일 수는 없었는데… 혹시 더 줄이는 용자 있으실까요? ㅋㅋ
1 Like
@루나시아
int a;while((a=Console.ReadLine().Sum(c=>c)-128)>0)Console.WriteLine(a);
@한민식
for(int a;(a=Console.ReadLine().Sum(c=>c)-128)>0;Console.WriteLine(a));
@tkm
for(int a;0<(a=Console.ReadLine().Sum(c=>c&15));Console.WriteLine(a));
모두 틀렸습니다.
오직 제출한 문제대로 동작하는 코드는 @한민식 님이 최초 게시한 코드만 동작합니다.
2 Likes
dimohy
December 18, 2024, 4:57am
9
제가 보기에는 맞아 보이는데 왜 맞지 않을까요?
1 Like
맞다고 하신 분들은 대부분 예제 입력1 으로 확인 하셨을 겁니다.
하지만 제시된 예제 입력1 은 어디 까지나 예일뿐 입력 에 대한 모든 경우의 수를 이야기하는 것은 아닙니다. 그냥 이렇게 입력하면 이렇게 나오는 경우일 뿐이죠.
중요한 것은 입력 요구 사항을 잘 읽어보시면 알 수 있습니다.
실제로 코드를 줄여볼 보려고 제시한 코드들을 보았으나 논리적으로 안될것으로 보였습니다. 그래서 제시한 코드들을 예제 입력1 의 방법도 시도해 보았지만 입력 요구 사항도 해보았습니다.
결론은 입력 요구 사항을 만족하지 못해 발생하는 문제입니다.
사실 입력 요구 사항도 불완전합니다.
1 Like
dimohy
December 18, 2024, 9:15am
11
위의 모든 분들의 코드가 입력에 대한 모든 경우의 수에 부합합니다.
A와 B는 0보다 크고 10보다 작으므로 한자리를 차지하는 숫자 1~9
그러므로 0 1 ~ 9 9 의 범위를 가지게 됨
어떤 부분이 부합하지 않는건지 예시를 주셨으면 좋겠어요.
A와 B를 한줄에 표시하기 위한 구분자의 정의라던가 그런건가요? 그것은 어느 정도 약속된 방식으로 보여지는데요… 그것 말고는 없지 않아요?
2 Likes
heyjude
December 18, 2024, 12:02pm
12
문제를 맞추는 것보다 문제를 내는 것이 더 어렵다는 것을 보여주는 사례인 것 같습니다.
입력 라인의 구성이 A_B(_ = 스페이스)로만 구성되면 괜찮으나, 아래와 같이 여분의 스페이스가 추가되는 경우에는 @한민식 님이 최초 게시한 코드만 동작하네요. @zangzang 님이 이부분을 말씀하신 것 같고요.
2 Likes
dimohy:
A와 B는 0보다 크고 10보다 작으므로 한자리를 차지하는 숫자 1~9
그러므로 0 1 ~ 9 9 의 범위를 가지게 됨
정리하신 부분에도 잘못되어 있습니다.
분명 보시시면
(0<A, B<10) 이 말은 A는 0보다 큰 무한한 양수를 가지게 됩니다.
그래서 A를 한글자 즉 0부터 9까지 입력할 경우 문제가 없는데 10이상의 숫자(2바이트 이상)가 되는 순간 char즉 1바이트를 대상으로 처리하는 로직의 경우 틀린 결과를 도출합니다.
B또한 10보다 작다고 했기 때문이 문제 라는 부분을 보면 A와 B는 정수라고 했기 때문에 역시 음수를 가질 수 있고 부호를 가지기 때문에 2바이트를 사용하면 역시 A와 같은 로직 붕괴가 발생합니다.
다른 분들도 정리하신 부분과 같은 식으로 인식하셔서 최초 게시한 풀이를 제외한 모든 풀이는 틀렸습니다.
1 Like
dimohy
December 18, 2024, 1:42pm
15
아하. (0 < A, B < 10) 을 A > 0, B < 10으로 해석하셨군요… 만약 그것이 맞다면 (A > 0, B < 10)으로 표시 되었어야 했을꺼에요. 그게 아니라 (0 < A, B < 10)인 것으로 보아 A와 B는 0보다 크고 10보다 작다. 즉 한 자리만 차지하는 1 ~ 9의 숫자라고 해석하는 것이 옳은 것 같아요.
2 Likes
네. 입력 형식에도 문제가 있습니다. 정확한 입력 규칙에 대한 언급은 없습니다.
1 Like
GPT도 그렇게 답하네요. 그럼 저의 답변은 틀린 답변이네요 ㅠㅠ
수학문제(산수)인가요 ㅠㅠ
그래도 정신승리를 위해서 GPT 변호사님에 부탁드렸습니다.
3 Likes
@tkm 님껄루 패턴매칭도좀 해봤는데 이것두 71에서 막히네용 ㅎ
while(Console.ReadLine().Sum(c=>c&15)is int a&a>0)Console.WriteLine(a);
2 Likes
heyjude
December 18, 2024, 10:47pm
19
궁금해서 해당 사이트 가서 위의 모든 코드들을 제출해 보니, 다 정답으로 나오네요.
세심하게 고민해서 정성 들여 만든 문제가 아니기에, 그냥 재밌게 풀고 가면 될 것 같습니다.
3 Likes
tkm
December 19, 2024, 4:47am
20
어… 제 코드는 여분의 스페이스가 입력되도 0으로 계산되기에 상관 없지 않나요?
2 Likes