인프런 커뮤니티 질문&답변

자르트님의 프로필 이미지

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

3-M

3-M 및 공부 방법

23.08.12 02:19 작성

·

307

0

  1. 문제에서 string을 그냥 sort 하는 이유는 어차피 출력할 때 "067789"이렇게 앞의 0도 포함시켜서 출력하고 비교하는 모든 사이즈가 같기 때문에 때문에 문자열들을 기본 sort를 해도 상관이 없어서인가요??

  2. 저는 정말 비효율적으로 코드를 짰지만 운이 좋아 코드가 통과 됐습니다.

http://boj.kr/ac9a920879094f88b09537cf47a064af

큰돌님께 배운 조합을 이용하여 모든 경우의 수를 뽑아 놓고 해당 경우의 수를 전부 순열로 돌립니다. 그리고 canCmp라는 함수를 통해 부등호 비교를 해서 한번이라도 틀리면 해당 경우를 시도하지 않습니다.

(1,2,3)을 뽑았으면 이것들의 부등호를 비교합니다. 틀리면 바로 다시 순서를 정해서 (1,3,2) 을 다시 위의 과정을 반복하고 통과될 경우 ret에 push를 해놓습니다.

기타 등등 문제가 많았습니다. string을 굳이 int로 바꿔서 해결하려다 메모리 에러(int의 구현범위 문제인 것 같아요) 등등이 나고 그냥 sort할 생각을 못해 bigger, smaller 라는 함수도 따로따로 만들었습니다.

이러다 큰돌님의 코드를 보면 정말 내가 비효율적이고 멍청하게 짰구나라는 생각 밖에 들지를 않습니다... 혹시 계속 문제를 풀다 보면 이렇게 짜는 일이 줄어들까요..?

  1. 한 문제를 푸는데 30분~1시간30분 정도 걸리고 코드에 대한 힌트를 백준에서 보고 다시 구현을 해봅니다. 그래도 못 풀겠으면 큰돌님의 영상을 보고 어떻게든 다시 내 코드를 살려보려고 하고 그래도 안되면 큰돌님의 코드를 최대한 이해하고 문제를 넘어갑니다. 이렇게 9월 중반까지 하루에 4문제씩 풀어서 강의를 마무리하려는 목표를 가지고 있습니다. 이런 학습 방식이다 보니 한 문제에만 최대 3시간 정도 투자를 하는 것 같습니다. 이렇게 문제를 푸는 것이 맞을까요? 풀다가 아닌 것 같거나 특정 시간을 넘어가면 답을 보는 게 더 효율적일까요? 한 문제를 너무 깊게 잡고 있는 것은 아닌가 싶어 질문드립니다!

    p.s 강의 항상 잘 듣고 있습니다. bfs, dfs 구현 조차 모르던 제가 이제는 이해하면서 구현을 할 수 있습니다. 좋은 강의 해주셔서 감사드리고 많은 질문에 항상 정성스럽게 답변 주셔서 감사드립니다! :)

답변 2

0

자르트님의 프로필 이미지
자르트
질문자

2023. 08. 12. 21:34

정말 감사합니다 큰돌님 :)

0

큰돌님의 프로필 이미지
큰돌
지식공유자

2023. 08. 12. 05:15

안녕하세요 자르트님 ㅎㅎ

  1. 문제에서 string을 그냥 sort 하는 이유는 어차피 출력할 때 "067789"이렇게 앞의 0도 포함시켜서 출력하고 비교하는 모든 사이즈가 같기 때문에 때문에 문자열들을 기본 sort를 해도 상관이 없어서인가요??

>>

일단 문자열을 비교하면 아스키코드 순으로 비교하게 됩니다.

예를 들어

012와 213 이렇게 비교한다면

0과 2 / 그 다음

1과 1 / 그 다음

2와 3 /

이렇게 왼쪽부터 아스키코드를 비교해서 큼과 작음을 비교하게 됩니다.

다만, 자릿수가 다르게 되면

12와 213 이렇게 되서

1과 2

2와 1 이렇게 비교하게 되는데요. 이렇게 되면 23과 123을 비교할 때

2와 1을 비교했을 때 1이 작다는 이유로 23보다 123이 크다는 결과가 나와버립니다.

네, 자르트님이 말씀하신 것처럼 string의 비교에서는 사이즈가 같은지를 확인하는 것이 중요합니다.

허나 이 문제같은 경우

사이즈가 같게 주기 때문에 기본적으로 sort만 해도 됩니다.

sort의 경우 사이즈 체크없이 크고, 작음만을 비교함.

 

 

  1. 저는 정말 비효율적으로 코드를 짰지만 운이 좋아 코드가 통과 됐습니다.

http://boj.kr/ac9a920879094f88b09537cf47a064af

큰돌님께 배운 조합을 이용하여 모든 경우의 수를 뽑아 놓고 해당 경우의 수를 전부 순열로 돌립니다. 그리고 canCmp라는 함수를 통해 부등호 비교를 해서 한번이라도 틀리면 해당 경우를 시도하지 않습니다.

...

혹시 계속 문제를 풀다 보면 이렇게 짜는 일이 줄어들까요..?

>> 원래 그렇습니다. 자르트님.하하.. 저는 정말 문제를 많이 풀고 시간도 많이 투자해서 얻어낸 효율적인 코드의 습관화일뿐이지, 그냥 답지 안보고 푸신 것만으로도 자르트님은 훌륭하십니다.

네. 계속 문제 풀고 제 강의나 풀이 보시면서 공부하시면 줄어들 것입니다.

  1. 한 문제를 푸는데 30분~1시간30분 정도 걸리고 코드에 대한 힌트를 백준에서 보고 다시 구현을 해봅니다. 그래도 못 풀겠으면 큰돌님의 영상을 보고 어떻게든 다시 내 코드를 살려보려고 하고 그래도 안되면 큰돌님의 코드를 최대한 이해하고 문제를 넘어갑니다. 이렇게 9월 중반까지 하루에 4문제씩 풀어서 강의를 마무리하려는 목표를 가지고 있습니다. 이런 학습 방식이다 보니 한 문제에만 최대 3시간 정도 투자를 하는 것 같습니다. 이렇게 문제를 푸는 것이 맞을까요? 풀다가 아닌 것 같거나 특정 시간을 넘어가면 답을 보는 게 더 효율적일까요? 한 문제를 너무 깊게 잡고 있는 것은 아닌가 싶어 질문드립니다!

     

    >> 너무 좋습니다. 일단 30 ~ 1시간 30분이 적정시간인데 딱 그정도면 정말 너무 좋은 루틴이 되어있는 것같습니다. 저를 믿고 이대로만 쭉 해주세요. 실력은 느실겁니다. 9월 중반이면 딱 코테 보기 전이네요. 좋습니다.

     

    p.s 강의 항상 잘 듣고 있습니다. bfs, dfs 구현 조차 모르던 제가 이제는 이해하면서 구현을 할 수 있습니다. 좋은 강의 해주셔서 감사드리고 많은 질문에 항상 정성스럽게 답변 주셔서 감사드립니다! :)

     

>> ㅎㅎ 화이팅입니다. 저또한 제 강의를 들어주셔서 감사합니다.

 

또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.