백준 2920번 음계 (Java, Kotlin)

: ) YOUNG·2022년 7월 1일
1

알고리즘

목록 보기
157/367

백준 2920번
https://www.acmicpc.net/problem/2920

문제



다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다.

1부터 8까지 차례대로 연주한다면 ascending, 8부터 1까지 차례대로 연주한다면 descending, 둘 다 아니라면 mixed 이다.

연주한 순서가 주어졌을 때, 이것이 ascending인지, descending인지, 아니면 mixed인지 판별하는 프로그램을 작성하시오.


생각하기


  • 처음 시작의 2가지만 구분하면 문제가 쉽다
    • 1로 시작하는지, 8로 시작하는지
  • 반복문을 활용하면 간단하게 해결 가능하다.

동작

Pass



코드



Java

import java.util.*;
import java.io.*;

public class Main {
	static int arr[][] = new int[100100][26];
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int T = Integer.parseInt(br.readLine());
		for(int t=1; t<=T; t++) {
			sb.append("Case #").append(t).append(": ");
			long result = 0;
			st = new StringTokenizer(br.readLine());
			int N = Integer.parseInt(st.nextToken());
			int Q = Integer.parseInt(st.nextToken());
			char chArr[] = br.readLine().toCharArray();
			
			for(int i=1; i<=N; i++) {
				for(int j=0; j<26; j++) {
					if(chArr[i-1] - 'A' == j) arr[i][j] = arr[i-1][j] + 1;
					else arr[i][j] = arr[i-1][j];
				}
			}
			
			while(Q-->0) {
				st = new StringTokenizer(br.readLine());
				if(checkPalindrome(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()))) result++;
			}
			sb.append(result).append('\n');
		}
		bw.write(sb.toString()); bw.flush(); bw.close();
	} // End of main

	private static boolean checkPalindrome(int L, int R) {
		long odd = 0; // 홀수의 개수
		for(int i=0; i<26; i++) {
			odd += (arr[R][i] - arr[L-1][i]) % 2;
		}
		
		if(odd < 2) return true;
		return false;
	} // End of checkPalindrome
} // End of Main class

Kotlin

import java.io.*
import java.util.*
private lateinit var st : StringTokenizer
fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    st = StringTokenizer(br.readLine())
    
    val num1 = st.nextToken().toInt()
    if(num1 == 1) find_ascending()
    else if(num1 == 8) find_descending()
    else print("mixed")
} // End of main

fun find_ascending() {
    for(i in 2..8) if(st.nextToken().toInt() != i) { print("mixed"); return }
    print("ascending")
} // End of find_ascending

fun find_descending () {
    for(i in 7 downTo 1) if(st.nextToken().toInt() != i) { print("mixed"); return }
    print("descending")
} // End of find_descending

0개의 댓글