[BOJ 2840 - Java] 행운의바퀴 - 구현문제

2024. 10. 18. 17:26·문제 풀이/백준 문제풀이
728x90
반응형
SMALL

문제정보


문제

상덕이는 최근에 행운의 바퀴를 구매했다. 상덕이는 바퀴의 각 칸에 알파벳 대문자를 아래 그림과 같이 적었다.

바퀴에 같은 글자는 두 번 이상 등장하지 않는다. 또, 바퀴는 시계방향으로만 돌아간다. 바퀴 옆에는 화살표가 있는데, 이 화살표는 항상 한 곳을 가리키고 있으며, 돌아가는 동안 가리키는 글자는 바뀌게 된다. 위의 그림에서는 H를 가리키고 있다.

상덕이는 바퀴를 연속해서 K번 돌릴 것이다. 매번 바퀴를 돌릴 때 마다, 상덕이는 화살표가 가리키는 글자가 변하는 횟수와 어떤 글자에서 회전을 멈추었는지를 종이에 적는다.

희원이는 상덕이가 적어놓은 종이를 발견했다. 그 종이를 바탕으로 상덕이가 바퀴에 적은 알파벳을 알아내려고 한다.

상덕이가 종이에 적어놓은 내용과 바퀴의 칸의 수가 주어졌을 때, 바퀴에 적어놓은 알파벳을 알아내는 프로그램을 작성하시오.

입력

첫째 줄에 바퀴의 칸의 수 N과 상덕이가 바퀴를 돌리는 횟수 K가 주어진다. (2 ≤ N ≤ 25, 1 ≤ K ≤ 100)

다음 줄부터 K줄에는 바퀴를 회전시켰을 때 화살표가 가리키는 글자가 몇 번 바뀌었는지를 나타내는 S와 회전을 멈추었을 때 가리키던 글자가 주어진다. (1 ≤ S ≤ 100)

출력

첫째 줄에 마지막 회전에서 화살표가 가리키는 문자부터 시계방향으로 바퀴에 적어놓은 알파벳을 출력한다. 이때, 어떤 글자인지 결정하지 못하는 칸은 '?'를 출력한다. 만약, 상덕이가 적어놓은 종이에 해당하는 행운의 바퀴가 없다면 "!"를 출력한다.

예제 입력 1 

3 3
1 A
2 B
3 C

---> !

슈도 코드

  1. 임포트
  2. 메인 메서드 생성
  3. 전체 배열 크기 N, 회전수 C, 방문 배열 visited
  4. while문으로 C만큼 반복
  5. 이동횟수 moveCount, 이동 후 값 AfterMoveValue, 이동 후 위치 curPoint
    1. 배열을 MoveCount만큼 뒤로 이동한 후의 값이 처음 입력하는 거라면 바로 입력하고 현재 위치를 최신화( ((N-moveCount%N) +N) %N)
    2. 만약 이미 입력되어 있다면 ‘!’를 출력하고 종료
  6. 그렇게 모든 반복문이 잘 수행되었다면 중복된 알파벳이 있는지 방문배열을 통해 확인
  7. 그 이후 curPoint를 시작으로 차례대로 출력하되 환영구조로 %N을 꼭 넣기

주요 규칙

  • 환영구조로 움직이는 원형 배열
  • 하지만 시계방향으로 움직이므로 인덱스는 ++이 아닌 —가 된다.
  • 입력된 배열을 거슬러 올라간다면 인덱스를 ++하며 확인도 가능하다.
  • 중복된 알파벳은 존재하지 않아야한다.
  • 바퀴의 각칸에는 한 개의 알파벳만 들어갈 수 있다.

구현 코드

package simulation;

import java.util.Arrays;
import java.util.Scanner;

/*
1. 임포트
2. 메인 메서드 생성
3. 전체 배열 크기 N, 회전수 C, 방문 배열 visited
4. while문으로 C만큼 반복
5. 이동횟수 moveCount, 이동 후 값 AfterMoveValue, 이동 후 위치 curPoint
    1. 배열을 MoveCount만큼 뒤로 이동한 후의 값이 처음 입력하는 거라면 바로 입력하고 현재 위치를 최신화( ((N-moveCount%N) +N) %N)
    2. 만약 이미 입력되어 있다면 ‘!’를 출력하고 종료
6. 그렇게 모든 반복문이 잘 수행되었다면 중복된 알파벳이 있는지 방문배열을 통해 확인
7. 그 이후 curPoint를 시작으로 차례대로 출력하되 환영구조로 %N을 꼭 넣기
 */
public class 행운의바퀴_2840 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int C = sc.nextInt();
        char[] arr = new char[N];
        int curPoint = 0;
        Arrays.fill(arr, '?');
        while (C-- > 0) {
            int moveCount = sc.nextInt();
            char afterMoveValue = sc.next().charAt(0);
            int nextPoint = ((curPoint - moveCount) % N + N) % N;
            if (arr[nextPoint] == '?') arr[nextPoint] = afterMoveValue;
            else if (arr[nextPoint] != afterMoveValue) {
                System.out.println("!");
                return;
            }
            curPoint = nextPoint;
        }
        boolean[] visited = new boolean[26];
        for (int i = 0; i < N; i++) {
            if(arr[i]=='?') continue;
            if(visited[arr[i] - 'A']) {
                System.out.println("!");
                return ;
            }
            visited[arr[i] - 'A'] = true;
        }
        for (int i = 0; i < N; i++) {
            System.out.println(arr[(curPoint+i)%N]);
        }
    }
}
728x90
반응형
SMALL

'문제 풀이 > 백준 문제풀이' 카테고리의 다른 글

[BOJ 2817 - Java] 알프스식 투표 - 구현문제  (1) 2024.10.18
[BOJ 3085 - Java] 사탕게임 - 구현문제  (1) 2024.10.15
[BOJ 3085 - Java] 사탕게임 - 구현문제  (0) 2024.10.15
알고리즘 - 위상정렬  (0) 2024.08.09
[BOJ14501 - Java] 퇴사문제 DP로 풀이하기  (0) 2024.07.28
'문제 풀이/백준 문제풀이' 카테고리의 다른 글
  • [BOJ 2817 - Java] 알프스식 투표 - 구현문제
  • [BOJ 3085 - Java] 사탕게임 - 구현문제
  • [BOJ 3085 - Java] 사탕게임 - 구현문제
  • 알고리즘 - 위상정렬
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (315)
      • 면접 준비 (36)
        • OS (6)
        • Spring Security (0)
        • Java (2)
        • DB (9)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      리눅스마스터2급정리
      백준
      자바 면접
      자바스크립트
      springsecurity
      자바 알고리즘
      HTML
      spring redis
      레디스
      자바
      jsp기초
      java
      스프링프레임워크
      JS
      Spring Data Redis
      자바 반복문
      Til
      JSP
      redis
      Spring
      Springframework
      jsp request
      redis 채팅
      리눅스
      프로그래머스
      리눅스마스터2급
      JavaScript
      CSS
      자바기초
      자바 면접질문
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [BOJ 2840 - Java] 행운의바퀴 - 구현문제
    상단으로

    티스토리툴바