컴퓨터공학 💻 도서관📚

백준 2840번 행운의 바퀴 본문

💣😝알고리즘 문제(CAM)/합체

백준 2840번 행운의 바퀴

들판속초록풀 2025. 5. 16. 23:08

내가 놓쳤던 부분들

돌림판이 2, 3, .. N바퀴 돌아간 경우

이미 채워진 문자가  다른 칸에 또 들어가면 안 된다

 

 

 

1)  내가 푼 방식  +   % 을 활용한 더 쉬운 출력 

N, K = map(int, input().split())

arr = ['?'] * N
check = False
ind = 0

for i in range(K):
    S, char = map(str, input().split())

    ind = (ind + int(S)) % N      // 돌림판이 2, 3, .. N바퀴 돌아간 경우 대비

    if arr[ind] == '?':
        if char in arr:          // 이미 채워진 문자가 다른 칸에 또 들어가면 안 된다
            check = True
            print('!')
            break
        arr[ind] = char
    elif arr[ind] != char:
        check = True
        print('!')
        break

if not check:
    for i in range(N):
        print(arr[(ind - i) % N], end='')     // %을 활용한 출력 방법

 

 

2) 내가 푼 방식

N, K = map(int, input().split())

arr = ['?'] * N
check = False
ind = 0

for i in range(K):
    S, char = map(str, input().split())

    ind = (ind + int(S)) % N

    if arr[ind] == '?':
        if char in arr:
            check = True
            print('!')
            break
        arr[ind] = char
    elif arr[ind] != char:
        check = True
        print('!')
        break

if check == False:
    tmp=0
    ans = ['?'] * N
    for i in range(ind, -1, -1):
        ans[tmp] = arr[i]
        tmp += 1
    for j in range(N - 1, ind, -1):
        ans[tmp] = arr[j]
        tmp += 1
    print(''.join(ans))

 

 

3) 다른 사람이 푼 방식 :  파이썬에 특화된 방법

n, k = map(int, input().split())
circle = ['?'] * n

for i in range(k):
    spin = input().split()

    s = int(spin[0])% n 
    s_char = str(spin[1])
    
    circle = circle[-s:] + circle[:-s]
    if circle[0] == '?':
        if s_char in circle:
            print('!')
            break
        circle[0] = s_char
    elif circle[0] == s_char:
        continue
    else:
        print('!')
        break
else:
    print("".join(circle))

 

 


 

 

자바 버전

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int K = sc.nextInt();
        char[] arr = new char[N];
        Arrays.fill(arr, '?');

        boolean check = false;
        int ind = 0;

        for (int i = 0; i < K; i++) {
            int S = sc.nextInt();
            char ch = sc.next().charAt(0);

            ind = (ind + S) % N;          // 돌림판이 2, 3, ... N바퀴 돌아간 경우 대비

            if (arr[ind] == '?') {
                                         
                for (char c : arr) {      // 이미 다른 칸에 같은 문자가 들어가 있는지 확인
                    if (c == ch) {
                        check = true;
                        System.out.println("!");
                        break;
                    }
                }
                arr[ind] = ch;
            } else if (arr[ind] != ch) {
                check = true;
                System.out.println("!");
                break;
            }
        }

        if (!check) {
            for (int i = 0; i < N; i++) {
                System.out.print(arr[(ind - i + N) % N]);   // %을 활용한 출력 방법
            }
        }
    }
}

'💣😝알고리즘 문제(CAM) > 합체' 카테고리의 다른 글

백준 1010번 다리 놓기  (0) 2025.05.15
Comments