220829 TIL 시간복잡도.. 새로운데?

2022. 8. 29. 23:48·성장이야기/TIL

오늘은 평소보다 일찍 일어나서 맑은 정신 상태로 코딩 도장 시간에 문제를 풀 수 있었다. 

오늘의 코딩 도장 문제는 뭐였을까용???

 

이거 모르는 사람 없죠..?

오늘의 문제는 완주하지 못한 선수로 이전에 한 번 풀어봤었던 문제라서 금방 풀 수 있을 줄 알았다.

우선 문제를 딱 보자마자 풀이과정이 바로 떠올라서 빠르게 작성하고 예시 테스트 케이스 다 통과시키고 프로그래머스에 빠르게 제출할 수 있었다.

근데 통과하지 못했다..

 

나는 3개의 예시 테스트를 모두 통과해서 다 맞춘 줄 알았지만 효율성 테스트에서 0점이 나왔다..

 

아래  코드가 효율성 0점짜리 코드이다.

public String solution(String[] participant, String[] completion) {
	String answer = "";
    
    List<String> participants = new LinkedList<>(Arrays.asList(participant));

    for (String value : completion) {
      for (String s : participant) {
        if (Objects.equals(value, s)) {
          participants.remove(s);
          break;
        }
      }
    }

    answer = participants.get(0);
    
    return answer;
}

아마 효율성 테스트에서 0점이 나온 이유는 이중 반복문 때문이라고 생각했다.

문제 요구사항을 보면 참가자의 수가 1명 이상 100,000명 이하인데 만일 100,000명일 경우 반복하는 횟수가 배로 증가해서 시간을 초과한 것 같다.

 

내가 생각해도 엄청 오래 걸릴 거 같은 게 만일 100,000명이 참가했을 경우 완주한 선수의 배열(길이 99,999)에서 한 명씩 뽑아온 뒤 그 선수를 참가자 배열(길이 100,000)에 모든 선수와 차례대로 비교하면 99,999 x 100,000번이 되는 거니까.... 시간이 좀 걸릴 수밖에 없는 코드였다.

 

이렇게 효율성 테스트를 통과시키기 위해 시간을 고려해서 알고리즘을 짜는 것을 시간 복잡도라고 하는 것 같다.

 

시간 복잡도란?

어떤 알고리즘이 어떤 문제를 해결하는 데 걸리는 시간을 의미한다. 

만일 결과가 같은데 시간이 더 적게 걸리는 코드가 있다면 그 코드가 더 좋은 코드라고 할 수 있다.

많은 사람들이 시간이 더 적게 걸리는 효율적인 알고리즘을 구성하기 위해 시간 복잡도를 고려한다고 한다.


 

지금까지 코드를 짜면서 시간은 고려해본 적이 없었던 것 같았는데 오늘 처음으로 똑같은 결과를 어떻게 하면 더 빨리 계산하게 할 수 있을지 생각해봤다.

근데 저번에 풀었던 문제인데 저번에는 어떻게 푼 거지..? 그때는 효율성 테스트 같은 거 고려 안 했던 거 같은데.....

 

아무튼 이중 반복문을 안 쓰고 풀었던 나의 방법은 정렬을 이용하는 거였다.

public String solution(String[] participant, String[] completion) {
    String answer = "";

    Arrays.sort(participant);
    Arrays.sort(completion);

    answer = participant[participant.length - 1];

    for (int i = 0; i < completion.length; i += 1) {
      if (!participant[i].equals(completion[i])) {
        answer = participant[i];
        break;
      }
    }

    return answer;
}

기존의 방법은 배열에서 한 명씩 꺼내서 모든 배열의 선수와 한 명씩 비교하는 거였다면

이번에는 두 배열을 정렬한 다음에 앞에서부터 비교해서 완주자와 참가자가 서로 다르면 바로 answer에 값을 담고 break를 통해 반복문을 멈췄다.

이렇게 하면 앞에서 완주자와 참가자가 서로 다른 선수가 발견되었을 때 뒤에 불필요한 선수들까지 비교할 필요가 없어져서 걸리는 시간이 확연히 줄어드는 것을 알 수 있다.

 

아무튼 오늘 코딩 도장 시간에 지금까지와는 다른 생각을 하면서 문제를 풀어서 재미있었다.

지금까지는 어떻게 하면 문제를 풀 수 있을지에 집중을 했다면 오늘은 어떻게 하면 코드의 실행 시간을 줄일 수 있을까?? 이 쪽에 더 포커스를 맞췄다.

 

지금까지 문제만 맞히면 장땡인 줄 알았는데 시간 복잡도라는 것을 알아버린 이상 더 나은 코드를 위해 시간을 고려 안 할 수가 없어졌다.

사실 아직 내 레벨이 프로그래머스 레벨 1 문제 하나 맞추는 것도 버거울 때가 많은데 시간까지 고려한다는 건 너무 욕심인가??

 

그러면 쉬운 문제를 풀 때는 의도적 수련으로 난이도를 높여 시간 복잡도도 고려하는 수련을 해봐야겠다.

 

'성장이야기 > TIL' 카테고리의 다른 글

220831 TIL 작업 단위로 커밋 하기  (0) 2022.08.31
220830 TIL 깨어있는 시간에 집중하기  (0) 2022.08.30
220828 TIL 오류를 대하는 자세  (0) 2022.08.28
220827 TIL 시간이 많다는 착각  (0) 2022.08.27
220826 TIL CORS가 뭐야..?  (1) 2022.08.26
'성장이야기/TIL' 카테고리의 다른 글
  • 220831 TIL 작업 단위로 커밋 하기
  • 220830 TIL 깨어있는 시간에 집중하기
  • 220828 TIL 오류를 대하는 자세
  • 220827 TIL 시간이 많다는 착각
seungjjun
seungjjun
  • seungjjun
    개발이야기
    seungjjun
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 성장이야기
        • TIL
        • 주간회고
      • Java
        • Spring
        • Spring Security
      • 트러블슈팅
      • Kafka
      • OS
      • Network
      • 메가테라
      • Database
      • Algorithm
      • Git
      • HTML
      • CSS
      • 독서
      • 컴퓨터 이해하기
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    메가테라 주간회고
    메가테라
    항해플러스
    주간회고
    이커머스 프로젝트
    graphQL
    redis
    개발일지
    항해99
    Til
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
seungjjun
220829 TIL 시간복잡도.. 새로운데?
상단으로

티스토리툴바