joowonleedesu   1년 전

안녕하세요,

완전 무베이스로 취미로 파이썬 공부 중입니다.

11720번 문제를 다음과 같이 풀었는데 틀렸습니다.

그런데 질문게시판의 다른 분들 글을 보니 완전히 다른 함수를 쓰셨더라고요.

아직 제 지식이 부족해서 다른 분들이 쓴 함수에 대해 잘 모르는데 여기서 질문이

1. 제 코드는 어디서 틀렸을까요?

2. 저는 숫자를 string으로 받은 다음에 indexing 후 정수형으로 바꿔 하나씩 더해주는 방식을 생각했는데, 다른 분들은 이 방식을 안 쓴 거 보니 비효율적인 거라 생각이 됩니다. 어떤 면이 비효율적인걸까요?

djm03178   1년 전

문제를 풀 때는 제출하기 전에 최소한 예제는 모두 통과될 때까지 직접 디버깅을 해보시기를 권장드립니다. 예제가 제대로 나오지 않는다면 한 줄씩 따라가면서, 어디서부터 의도한 로직과 다르게 동작하는지 출력을 해보는 등 디버깅을 하기가 수월합니다.

range(a,b)는 a부터 b-1까지의 범위를 보는 것입니다. 그래서 range(0,N-1)만큼 루프를 돌면 루프가 도는 횟수는 N-1입니다. 봐야 하는 자릿수는 N개인데, 마지막 걸 빼고 N-1개만 보고 있기 때문에 틀리게 됩니다.

i=i+1이라는 문장은 필요하지 않습니다. i in range 자체가 알아서 i의 값을 1씩 증가시켜주기 때문입니다. 루프 중간에 i의 값을 임의로 바꾸더라도, 루프가 돌 때마다 무조건 i는 0, 1, 2 순서대로 나옵니다.

또한 다른 사람들이 다른 방법으로 풀었다고 해서 이 방법이 비효율적이라는 뜻은 아닙니다. 문제를 푸는 방법은 정해져 있지 않고, 수없이 많은 종류의 풀이가 있을 수 있습니다. 다른 사람들도 절대 최적의 방법을 찾아서만 효율적으로 문제를 푸는 것이 아닙니다. 지금 코드도 효율성 면에서는 나쁘지 않습니다. 코드의 효율성은 나중에 시간 복잡도 등을 공부한 뒤에 자신의 코드에 대해 객관적으로 분석하는 연습을 해보세요.

ufshg   1년 전

코드 쓰는 스타일은 다 달라서 잘 배우시면 됩니다.

눈에 띄는 부분은 for문의 range부분이네요.

range(0, N-1) 로 써두셨는데, 파이썬에서 range(a, b)를 사용하면 a번째부터 b - 1번째까지 진행합니다.

따라서 마지막 원소가 체크가 안되는 것이죠. 

range(0, N)을 사용하거나, 지금처럼 그냥 처음부터 N개 혹은 단순 N번 반복시에는 range(N) 해주시면 됩니다.

i += 1도 따로 필요없겠습니다.

문제가 간단해서 비효율이라고 할만한건 없지만 추가로 오지랖좀 부려볼게요.

2번 줄에 str(input()) 사용하셨는데, input()은 기본적으로 str을 받습니다. str 생략하셔도 돼요.

j를 따로 선언하고 j = int(~) 후 answer에 더하는것도 틀린건 아니지만, answer = answer + int(~) 처럼 따로 j 선언 없이 진행하셔도 괜찮습니다.

단순히 어떤 변수에 값을 더하는 경우 answer = answer + j도 가능하고 answer += j 도 가능합니다. 코드가 좀더 짧죠.

joowonleedesu   1년 전

안녕하세요,

두 분 모두 답변 감사드립니다.

'i=i+1이라는 문장은 필요하지 않습니다' 이 설명 아니었으면 전 계속 저걸 넣어서 했을 것 같네요.

두번째 답변분 오지랖 정말 감사드립니다. 혼자 공부하느라 이런 꿀팁 어디서 들을 수가 없었는데 참고하겠습니다.

좋은 하루 되세요:)

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