[WEEK01] 6일차 TIL. 해결한 알고리즘

kozi·2023년 3월 4일
0

SW사관학교 정글

목록 보기
3/33

들어가기 전에

입력값을 받을 때 input() 함수를 사용하고 있었는데

sys.stdin.readline() > raw_input() > input()
위의 순서로 sys.stdin.readline()가 더 빠르다고 한다.

https://www.acmicpc.net/board/view/855

수 정렬하기 2

sort() 함수를 사용해서 해결하였다.

리스트.sort()sorted(리스트)의 차이는
리스트.sort()는 본체 리스트를 정렬하는 것이고,
sorted(리스트)는 본체 리스트는 둔 체로 정렬한 새로운 리스트를 반환하는 것이다.

위 예시 코드에서 7 4 5 2 3 을 입력값으로 넣으면 다음과 같이 출력된다.

수 정렬하기 3

sort()함수로도 잘 풀리던 수 정렬하기2의 코드를 그대로 쓰면
수 정렬하기3에서는 메모리 초과가 뜨게 된다.
문제에서 10000보다 작거나 같은 자연수(1~10000)가 주어진다고 했으므로
계수 정렬을 사용해서 해결한다.

1부터 10000까지 숫자가 들어갈 배열을 생성하고 0을 미리 채워넣은다음
배열의 인덱스에 해당하는 숫자가 들어올때마다 해당 인덱스의 배열에 1을 더해주고 출력할때는 0이 아닌 다른 수가 채워진 배열의 인덱스 번호를 반복문을 통해 해당 배열에 들어있는 숫자(아까 1씩 더한 숫자)만큼 출력한다.

내가 작성한 코드

단어 정렬

중복을 제거하고, 오름차순으로 출력하되 글자수가 적은 것부터 출력하는 문제이다.

set()함수를 이용해서 리스트 내에 중복되는 값을 제거하고, sort()함수를 이용해서 정렬,
글자수가 50자가 넘을 수 없다는 점을 이용해 이중 for문을 사용해서 글자수가 적은 수부터 출력하는 방식으로 코드를 작성했다.

내가 작성한 코드

차이를 최대로

처음에 접근을 잘못해서 for문과 if문을 남발하며 N이 짝수일 때와 홀수일 때를 나누고... 엄청난 노가다를 하였는데 실패하였다.

다시 천천히 문제를 보니 그냥 순열을 통해 모든 케이스를 뽑아서 각 케이스마다의 case[i+1] - case[i] 절대값의 합을 구하고 최댓값을 갱신해주면 되는 거였다.

검색해보니 파이썬에 순열을 구해주는 permutations라는 함수가 있어서 해당 함수를 사용한 반복문을 통해 해결했다.

순열 말고도 dfs를 통한 백트래킹 방법으로도 구할 수 있는 것 같던데 이 문제는 해당 방법 또한 모든 케이스를 비교해가며 구한다고 하여 더 깊이 있게 알아보진 않았다. 하지만 dfs 방식을 잘 알아놓으면 좋을 것 같아서 시간이 나는 대로 분석해보려고 한다.

내가 작성한 코드

profile
어제보다 잘하고 싶은 개발자 Kozi 입니다.

0개의 댓글