본문 바로가기

백준 write-up/정렬 & 그리디

[백준] 카드 문자열 : 13417번 - Python

728x90
반응형

https://www.acmicpc.net/problem/13417

 

13417번: 카드 문자열

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각각의 테스트 케이스의 첫째 줄에 처

www.acmicpc.net

 

 

 

문제를 풀면서 몰랐던 개념

 

(1) [Python] insert() 함수

: append() 함수와 마찬가지로 요소를 추가할 수 있는 함수이지만 추가하는 방식이 다름.

append() -> 요소를 배열의 끝에 추가함! / insert() -> 요소를 배열의 원하는 위치 i앞에 삽입할 수 있음!

arr = [1, 2, 3, 4, 5]

arr.insert(0, 10)	# 0번째(맨 앞에) 추가
print(arr)


# 출력결과
>>> [10, 1, 2, 3, 4, 5]
arr = [1, 2, 3, 4, 5]

arr.insert(-1, 10)	# 끝에서 1번째 전에 추가
print(arr)


# 출력결과
>>> [1, 2, 3, 4, 10, 5]
arr = [1, 2, 3, 4, 5]

arr.insert(2, 10)	# 2번째(3) 전에 추가
print(arr)


# 출력결과
>>> [1, 2, 10, 3, 4, 5]

 

(2) [Python] 문자열(string) 사전 순으로 비교하기

: 정수의 값을 비교하듯이 부등호(<,>,<=,>=)를 사용해서 어떤 문자열이 사전 순으로 나열했을 때 더 앞에 와야 하는지 판별할 수 있다.

word = 'apple'

if word < 'banana':
    print("'apple'이 사전순으로 더 먼저다!")
elif word > 'banana':
    print("'apple'이 사전순으로 더 나중이다!")
else:
    print("두 단어는 같다!")


# 출력결과
>>> 'apple'이 사전순으로 더 먼저다!

* 쉽게 말해서 사전순으로 더 먼저인 단어가 더 작은 값이다!

 

 

 

문제의 접근 방법

 

- 제일 앞에 있는 카드를 기준으로 뒤에 있는 문자들을 순차적으로 비교해나가야 함.

- 문자열이 사전 순으로 더 먼저인지 나중인지 판별하기 위해서는 부등호를 사용해야 함.

- 새로 입력받은 문자와 양 끝 글자를 비교해서 제일 첫 번째 있는 문자보다 작다면 제일 앞에 카드를 추가하고 그게 아니라면 맨 뒤에 추가해야 함.

 

 

 

내가 막혔던 부분

 

- 카드를 그냥 정렬하면 해당 출력 값이 나온다고 착각함.

- insert()의 개념을 잘 모르고 있어서 리스트에 append() 함수를 사용해서만 추가하려다 보니까 막힘.

- 문자열 비교에 대한 개념이 부족했음.

 

 

 

문제 풀이 방법

 

(1) 테스트 케이스 T개 입력받기

(2) T번 만큼 카드의 개수 N과 N장의 카드에 적힌 알파벳의 초기 순서 init 문자열을 리스트로 입력받기

(3) 카드를 재배치할 빈 리스트 arr 선언 후, 제일 먼저 가져와야 할 init[0] 값 추가하기

(4) 맨 앞에 있는 카드는 이미 arr에 첫 번째로 추가되었기 때문에 인덱스 1번째 요소부터 arr에 있는 값과 순차적으로 비교해 나가기

(5) init의 i번째 요소 값이 arr의 0번째 요소(제일 앞에 있는 값) 보다 작거나 같다면 arr의 맨 앞에 추가해주기

(6) 그게 아니라면 arr의 맨 뒤에 추가해주기

(7) (4)~(6)과정을 init의 길이만큼 반복한 후 출력 형식에 맞춰서 출력해주기!

 

 

 

소스코드

T = int(input())

for _ in range(T):
    N = int(input())
    init = list(input().split())

    arr = []
    arr.append(init[0])

    for i in range(1, len(init)):
        if init[i] <= arr[0]:
            arr.insert(0, init[i])
        else:
            arr.append(init[i])

    [ print(i, end='') for i in arr ]
    print()
728x90
반응형