월하점
월하점의 개발 공부 일지
월하점
전체 방문자
오늘
어제
  • 분류 전체보기 (96)
    • Back-end (3)
    • PROJECT (1)
    • CS (15)
      • Operating System (0)
      • Network (4)
      • Data Structure (7)
      • Algorithm (0)
      • Database (4)
    • Problem Solving (52)
    • Programming Languages (1)
      • Javascript (0)
      • Python (1)
      • JAVA (0)
    • Codestates BEB 4기 (7)
    • Blockchain (12)
    • Linux (2)
    • Git (1)
    • 잡다한 (2)

공지사항

인기 글

태그

  • 네트워크
  • javascript
  • SWEA
  • django
  • 자료구조
  • CS
  • 프로그래머스
  • baekjoon
  • Python
  • node.js
  • 알고리즘

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
월하점

월하점의 개발 공부 일지

  • HOME
  • GUEST
  • WRITE
Problem Solving

[SWEA] D3 - 13428. 숫자 조작 in 파이썬

2022. 5. 24. 01:00

문제 출처

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

 

문제

9자리 이하의 음이 아닌 정수 N이 있다. 당신은 이 수에서 한 쌍의 숫자를 골라 그 위치를 바꾸는 일을 최대 한 번 하여(안 하거나, 한 번만 하여) 새로운 수 M을 만들 수 있다. 단, 바꾼 결과 M의 맨 앞에 ‘0’이 나타나면 안 된다.

M의 최솟값과 최댓값을 구하는 프로그램을 작성하라.

[입력]
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스는 하나의 줄로 이루어진다. 각 줄에는 0 이상 999,999,999 이하의 정수 N이 주어진다. N ≠ 0 이라면 주어지는 수가 0으로 시작하지 않는다.


[출력]
각 테스트 케이스마다, M의 최솟값과 최댓값을 공백 하나를 사이로 두고 출력한다.

 
 

문제 풀이

 두 요소끼리 자리를 바꾸는 경우의 수를 구하고, 각각의 경우의 수대로 자리를 바꾼 결과값의 크기를 비교해가며 min, max를 구하면 될 것이다.

 

 경우의 수가 (1,2) 이든 (2,1)이든 1번 인덱스와 2번 인덱스 값을 바꾸는 것이므로 (1,2) 하나의 경우의 수만 있으면 된다. 즉, 순서는 중요하지 않으므로 순열이 아닌 조합을 구한다.

 

 또한 0 은 맨 앞자리에 올 수 없다는 조건을 추가해준다. 경우의 수대로 자리를 바꾸고 나서 문자 리스트의 첫 번째 요소가 0이 되는 경우, 해당 경우의 수에는 자리 바꾸기를 취소하고 문자를 원위치시킨다.

 

 

작성 코드

from itertools import combinations
import sys
sys.stdin = open("input.txt", "r")

T = int(input())
for test_case in range(1, T+1):
    N = list(x for x in input())        # 입력받은 문자열을 문자리스트로 변환
    target = [i for i in range(len(N))] # 바꿀 문자의 인덱스를 추출하기 위한 리스트
    
    min_num, max_num = int(''.join(N)), int(''.join(N))

    for value in combinations(target, 2):  # 순서는 중요하지 않으므로 permutations(순열) 대신 combinations(조합)
        i, j = value
        N[i], N[j] = N[j], N[i]
        if N[0] == '0':
            N[i], N[j] = N[j], N[i]
            continue
        if int(''.join(N)) < min_num:
            min_num = int(''.join(N))        
        if int(''.join(N)) > max_num:
            max_num = int(''.join(N))        
        N[i], N[j] = N[j], N[i]
        
    print(f'#{test_case} {min_num} {max_num}')

 

 


 

알게된 점

: 파이썬의 itertools

 

1. combinations (조합)

- 순서 고려 X

- 요소의 값이 아니라 위치로 고유성을 다룸

itertools.combinations(iterable, r)
# 입력 iterable에서 요소의 길이 r 서브 시퀀스들을 반환

예)

li = ['a','b','c','d']
result = list(combinations(li, 2))
print(result)


## 출력 결과 ##
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]

2. permutations (순열)

- 순서 고려 O

- 요소의 값이 아니라 위치로 고유성을 다룸

itertools.permutations(iterable, r=None)
# iterable에서 요소의 연속된 길이 r 순열을 반환
# r이 지정되지 않았거나 None이면, r의 기본값은 iterable의 길이이며 가능한 모든 최대 길이 순열이 생성

예)

li = ['a','b','c','d']
result = list(permutations(li, 2))
print(result)

## 출력 결과 ##
[('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'a'), ('b', 'c'), ('b', 'd'), ('c', 'a'), ('c', 'b'), ('c', 'd'), ('d', 'a'), ('d', 'b'), ('d', 'c')]

 

그 외의 itertools 모듈에 내장된 함수 더보기

저작자표시 비영리 변경금지 (새창열림)

'Problem Solving' 카테고리의 다른 글

[백준] 18258 - 큐2 in 파이썬  (0) 2022.05.29
[SWEA] D2 - 1974. 스도쿠 검증 in 파이썬  (0) 2022.05.27
[SWEA] D3 - 14178. 1차원 정원 in 파이썬  (0) 2022.05.23
[SWEA] D3 - 13547. 팔씨름 in 파이썬  (0) 2022.05.22
[SWEA] D3 - 13229. 일요일 in 파이썬  (0) 2022.05.22
    'Problem Solving' 카테고리의 다른 글
    • [백준] 18258 - 큐2 in 파이썬
    • [SWEA] D2 - 1974. 스도쿠 검증 in 파이썬
    • [SWEA] D3 - 14178. 1차원 정원 in 파이썬
    • [SWEA] D3 - 13547. 팔씨름 in 파이썬
    월하점
    월하점
    개발 공부를 기록합니다. 웹을 위주로 공부하며 컴퓨터과학 이론도 함께 정리할 계획입니다.

    티스토리툴바