santoo   2년 전

이건 뭐... 정석대로 알고리즘을 짠거 같아서 어디서 시간복잡도가 증가한건지 알 수가 없네요. 고수분들 답변 부탁드립니다 ^^

bamgoesn   2년 전

제가 스위프트를 사용하는 건 아니라서 직접적인 도움을 드리진 못 합니다만, 스위프트가 입출력이 상당히 느린 편이고, 이를 빠르게 하는 데에도 불편함이 상당한 데에 비해, 백준에서 스위프트에 대해 추가 시간을 주지 않는 것으로 알고 있습니다.

만약 입출력 속도를 향상시키기 위한 트릭을 사용하지 않으셨다면 (잘 모르지만 그래 보입니다) 한번 스위프트 빠른 입출력에 대해 알아보시고 적용해보는 게 좋을 것 같습니다.

wapas   2년 전

빠른 입출력을 적용하니 20ms 차이로 아슬아슬하게 통과가 됩니다. ( 빠른 입출력 소스 코드 주소 )

입출력이 10~20만 줄 넘어가면 Swift는 빠른 입출력을 쓰는 것을 권장합니다.

그리고 해당 문제처럼 출력할 양이 많으면 일일이 print 해주는 것보다 String 타입인 output 변수를 output += "\(answer)\n"해서 마지막에 한 번에 출력하는 것이 더 빠릅니다.

이와 별개로 7번째 줄, 16번째 줄, 20번째 줄, 21번째 줄에 있는 a.count를 호출할 때마다 O(n) 시간이 소요됩니다. ( 이는 count가 배열 원소를 일일이 세기 때문입니다. )

또한, 10번째 줄 a.max()도 마찬가지로 호출할 때마다 O(n) 시간이 소요됩니다. ( count와 마찬가지로 max()도 배열 원소를 일일이 비교합니다. )

결론적으로 빠른 입출력을 하지 않았기 때문에 시간 초과가 난 것은 맞지만, 작성자님이 써주신 알고리즘은 다소 비효율적인 것으로 보입니다.

wapas   2년 전

추가로 빠른 입출력을 이용해 해결한 15552번 문제의 소스 코드를 올려두겠습니다.

santoo   2년 전

@wapas xcode에서 돌리면 안되서 며칠째 고민하다가 그냥 제출하니 정답처리 되네요. 너무 감사합니다. 말씀해주신 시간복잡도 줄이도록 노력해보겠습니다. wapas님 코드 보면서 많이 배우고 갑니다 !!

wapas   2년 전

아, 그 부분을 이야기 못 했군요.

저도 빠른 입출력 소스 코드는 Xcode에서 제대로 작동하지 않아서 readLine(), print()로 작성하고 테스트합니다.

그 후 제출할 때만 FIO.readInt(), FIO.readString(), FIO.print()로 바꿔서 빠른 입출력 소스를 사용하고 있습니다.

wapas   2년 전

정정합니다.

Array의 count 메소드의 시간 복잡도는 O(1)이 맞네요.

String의 count 메소드는 시간 복잡도가 O(N)라서 String과 헷갈렸습니다.

wapas   2년 전

빠른 입출력 소스 코드를 공부하다가 알게되었는데, 제가 소개해드린 빠른 입출력 소스 코드는 엔터가 아닌 EOF를 입력하셔야 입력 완료가 되더라구요.

그래서 터미널에서 값을 입력한 뒤 제일 마지막에 Ctrl+D (EOF 입력)를 해주시면 작동될겁니다.

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