[백준] 1039번 교환 (C++)

2025. 10. 4. 22:22·Algorithm
728x90

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

 

 

이 문제는 정수의 i번째 숫자와 j번째 숫자를 K번 변경하여서 만들 수 있는 가장 큰 숫자를 찾는 문제이다.

 

정확히 K번을 변경해야 하기때문에 그리디하게 맨 앞자리에서부터 큰 숫자를 찾아서 변경하는 방법이 불가능할 것 같다고 생각하였으며 N은 최대 100만으로 자리수가 6자리로 자리수를 변경하는 모든 경우의수를 찾으면 되지 않을까 생각하였다.

 

 

이를 해결하기 위해서 현재 숫자에서 나올 수 있는 숫자를 탐색하는 bfs(너비 우선 탐색)을 활용하였으며 K번(횟수)에 따라 나올 수 있는 수가 다르기 때문에 2차원 방문배열을 사용하여 방문체크를 하였다.

 

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    int y;
    int r;
};

int dx[] = {-1, 1, 0, 0, 1, -1, -1, 1};
int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};
int N, K;
int answer = -1;

void bfs() {
    queue<pair<string, int>> q;
    q.push({to_string(N), 0});
    vector<set<string>> visited(K+1);

    while(!q.empty()) {
        string value = q.front().first;
        int cnt = q.front().second;
        q.pop();

        if(cnt == K) {
            int ans = stoi(value);
            answer = max(ans, answer);
            continue;
        }

        for(int i = 0; i < value.size(); i++) {
            for(int j = i + 1; j < value.size(); j++) {
                string tmp = value;
                char tmpch = tmp[i];
                tmp[i] = tmp[j];
                tmp[j] = tmpch;

                if(tmp[0] == '0') continue;

                if(visited[cnt+1].count(tmp)) continue;

                visited[cnt+1].insert(tmp);
                q.push({tmp, cnt+1});
            }
        }
    }
}

void solve() {
    bfs();

    cout << answer;
}

void input() {
    cin >> N >> K;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 5624번 좋은 수 (C++)  (0) 2025.10.05
[백준] 5052번 전화번호 목록 (C++)  (0) 2025.10.05
[백준] 1253번 좋다 (C++)  (0) 2025.10.03
[백준] 13905번 세부 (C++)  (0) 2025.10.02
[백준] 13325번 이진 트리 (C++)  (0) 2025.10.01
'Algorithm' 카테고리의 다른 글
  • [백준] 5624번 좋은 수 (C++)
  • [백준] 5052번 전화번호 목록 (C++)
  • [백준] 1253번 좋다 (C++)
  • [백준] 13905번 세부 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279)
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    우선순위 큐
    Bandit
    백트래킹
    그래프 이론
    시뮬레이션
    wargame
    c언어
    누적합
    WebSecurity
    정렬
    DFS
    그리디
    백준
    BFS
    재귀
    브루트포스
    이분탐색
    비트마스킹
    코딩
    다익스트라
    구현
    우선순위큐
    Leviathan
    깊이우선탐색
    linux
    에라토스테네스의 체
    트리
    투포인터
    DP
    다이나믹 프로그래밍
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1039번 교환 (C++)
상단으로

티스토리툴바