sssunho   6년 전

제가 따로 돌렸을 땐 6이라고 제대로 뜨는데 왜 안되는지 모르겠습니다..


+

그래서 다른 언어로 풀고 숏코딩을 보고 배우려했는데

c=input().count;print(c('')+~sum(map(c,['-','=','nj','lj','dz='])))

이 코드도 이해가 안됩니다. 설명해주시면 감사하겠습니다ㅠㅠ

jh05013   6년 전

어떻게 푸신 건지 모르겠습니다. 몇 개 넣어 보시면 금방 반례가 나옵니다.

jh05013   6년 전

그리고 숏코딩은... 배경지식을 모르는 상태에서는 이해할 수 없다고 생각합니다만, 일단 어떻게 작동하는지는 설명드리겠습니다. 숏코딩은 숏코딩의 용도로만 사용할 뿐, 평상시의 코딩에서 사용하는 것은 권장하지 않습니다.

먼저 input()으로 입력받은 스트링의 count 메서드를 c에 저장합니다. 그러므로 c(s)를 실행하면 입력에 들어있는 s의 개수를 셀 수 있습니다. 여기까지가 c=input().count이고, 코드를 분리시키기 위해 ;을 넣습니다.

c('')은 빈 문자열의 개수를 (?) 세라는 뜻인데, 이것은 입력의 길이 + 1과 같습니다. 여기서 1을 빼면 입력의 길이이겠지만, 그 중 길이가 2인 크로아티아 알파벳이 있으므로 그 개수도 같이 빼야 하고, 길이가 3인 dz=는 두 번 빼야 합니다. 그러려면 -, =, nj, lj, dz=의 개수를 각각 세서 빼면 됩니다.

map(c, L)은 L의 각 원소에 c를 적용시키라는 뜻입니다. 즉 c('-'), c('='), ..., c('dz=')이 되겠죠. 이걸 sum에 넣어서 모든 개수의 합을 구합니다. 여기까지가 sum(map(c,['-','=','nj','lj','dz=']))이고, 이 값을 X라고 하겠습니다.

결국 구하는 답은 c('') - X - 1이 되는데, 여기서 코드의 길이를 더 줄이기 위해 ~X를 사용합니다. ~X는 -X-1과 같습니다. 그러므로 c('')+~X로 변형할 수 있습니다.

이를 종합하면 c=input().count;print(c('')+~sum(map(c,['-','=','nj','lj','dz='])))를 얻습니다.

댓글을 작성하려면 로그인해야 합니다.