일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 벤쿠버
- 머신러닝
- Spring Framework
- 백준
- 릿코드
- 다이나믹프로그래밍
- Java
- 프로그래밍언어론
- 시애틀
- 라인플러스
- 딥러닝
- STL
- C++
- 라인
- binary search
- C/C++
- 모두를 위한 딥러닝
- Python
- 스타벅스
- spring
- BFS
- 알고리즘
- 프로그래머스
- jvm
- 파이썬
- DP
- leetcode
- 백트래킹
- dfs
- 스프링 프레임워크
Archives
- Today
- Total
케이스윔의 개발 블로그
[백준][BFS] 1039번 교환 본문
문제
정수 N이 주어졌을 때 M이 정수자릿수라면 1<= i < j <= M 인 i, j를 골라서 i번 위치와 j번의 위치를 바꿉니다. 이러한 교환을 K번 했을 때 나올 수 있는 최댓값을 구해야합니다.
문제 출처: 백준 온라인 저지(https://www.acmicpc.net/problem/1039)
풀이
처음엔 살짝 조건을 착각했는데 교환할 수 없는 조건은 맨 앞자리 수가 0이 되는 경우뿐이고, 그렇지 않을 때는 i<j 인 i, j 위치끼리 교환이 가능합니다. 여기서 K번 연산을 할 수 없는 경우라는 조건이 있기 때문에 만약 i번째 자리와 j번째가 같더라도 연산은 할 수 있기때문에 교환작업을 해줘야합니다.(만약 숫자가 같은 경우 바꾸지 않도록 해주어서 틀렸습니다를 받았습니다.) 처음에 동일한 숫자가 되는 경우가 가능하지 않다고 생각을하고 visited 배열을 만들었는데 동일한 숫자가 같은 단계에서는 큐에 넣을 필요가 없고 연산 횟수가 다를 때 나타난 경우에는 이미 나타난 숫자도 큐에 넣을 수 있어야 합니다. 중복이 된다고 생각해서 visited를 사용하지 않았더니 메모리 초과가 났습니다. 그래서 한 단계마다 새로 큐를 만들어서 중복되지 않도록 해주었습니다.(또는 단계마다 큐를 초기화해주는 것과 같습니다.) 이렇게 큐에서 한단계씩 빼내는 작업은 K번했을 때 가장 큰 숫자를 저장해서 출력하면 됩니다. 만약 K번 작업을 하지 않았는데 큐가 비었다는 것은 더이상 교환 연산을 할 수 없다는 뜻이므로 -1을 출력해줍니다.
코드
'Algorithm' 카테고리의 다른 글
[프로그래머스][카카오] 캐시 (0) | 2018.12.17 |
---|---|
[프로그래머스][문자열처리] 다트게임 (0) | 2018.12.17 |
[백준][이분탐색] 1654번 랜선자르기 (0) | 2018.11.28 |
[백준][이분탐색] 15732번 도토리 숨기기 (2) | 2018.11.27 |
[백준][이분탐색] 3079번 입국검사 (0) | 2018.11.24 |
Comments