코딩가딩가

[JAVA]BOJ 2840, 행운의 바퀴

Noooodle 2024. 7. 21. 22:01

좀 불친절한 문제이다. 예외를 설명해주지 않았다. 그리고 !가 나오는 조건도 너무 애매하게 적혀있고.. 문제자체는 크게 어렵지 않다.

 

! 가 출력되는 조건은 아래와 같다.

1. 룰렛이 제대로 생기지 않았을때 -> 0번칸에 A도 들어있고 B도 들어있다 -> 말이 안됨 -> ! 출력

2. 룰렛에 중복된 알파벳이 있을때 -> 0번칸에 A, 1번칸에도 A -> 중복이라서 안됨 -> ! 출력

 

위 조건만 유의해서 코드를 짜면된다.. !의 조건을 이해하는데 너무 오랜 시간을 썼다;;

행운의 룰렛(HONITAVR)이 아니면 !를 출력해야한다고 적혀있는데, 굳이 그런 조건을 주지 않아도 통과하더라..

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;


public class BOJ2840 {
    public static int checkAlphaValid(char[] charArr, int N){ // 알파벳 중복 체크 함수
        int i, j;

        for(i=0;i<N;i++){
            for(j=i+1;j<N;j++)
                if(charArr[i] != '?')
                    if(charArr[i] == charArr[j])
                        return 0;
        }
        return 1;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N, K, S, i, idx = 0, flag = 1;
        char tmp;
        String str;
        StringTokenizer st;

        str = br.readLine();
        st = new StringTokenizer(str);
        N = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        char[] charArr = new char[N];
        
        for(i=0;i<K;i++){
            str = br.readLine();
            st = new StringTokenizer(str);

            S = Integer.parseInt(st.nextToken());
            tmp = st.nextToken().charAt(0);

            // 1. 배열 idx 확인, 2. 비었는지 확인
            if(idx + S >= N)
                idx = (idx + S) % N;
            else
                idx += S;

            if(charArr[idx] == '\u0000') // 해당 자리가 비어있을때
                charArr[idx] = tmp;
            else if(charArr[idx] != tmp) // 비어있지는 않은데 다른 알파벳일때
                flag = 0;
        }

        // 빈 자리 ? 로 바꾸기
        for(i=0;i<N;i++)
            if(charArr[i] == '\u0000')
                charArr[i] = '?';
        
        // 중복 알파벳 체크
        if(flag != 0)
            flag = checkAlphaValid(charArr, N);

        // 결과 출력
        if(flag == 0) // 같은 칸에 다른 알파벳인 경우 or 중복 알파벳 있는 경우
            System.out.println("!");
        else{ // 행운의 바퀴가 있거나 제대로된 룰렛인 경우
            for(i=0;i<N;i++)
                if(idx - i >= 0)
                    System.out.print(charArr[idx - i]);
                else
                    System.out.print(charArr[idx - i + N]);
            System.out.println();
        }
    }
}

출력시에, 마지막 위치부터 시계방향은 배열을 거꾸로 출력해주는 것이다. 반례랑 결과값을 보고 그대로 나오게 조건을 좀 주면 된다..

'코딩가딩가' 카테고리의 다른 글

[JAVA]BOJ 10814, 나이순 정렬  (0) 2024.07.24
[JAVA]BOJ 1181, 단어 정렬  (1) 2024.07.24
[JAVA]BOJ 10250, ACM 호텔  (0) 2024.07.17
[JAVA]BOJ 3058, 짝수를 찾아라  (0) 2024.07.17
[JAVA]BOJ 11068, 회문인 수  (0) 2024.07.17