CS/Baekjoon

[Algorithm] 백준 단계별로 풀어보기 - 단계 8. 규칙 찾기 (1)

칸타탓 2019. 4. 18. 16:56

BaekJoon Oline Judge - Step 8

2292. 벌집

더 큰 육각형으로 갈 때마다 6씩 늘어난다. 숫자는 초기화되지 않으므로 계속 누적해 줘야함!

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		scan.close();

		int count = 1, six = 6, index = 1;
		while(true) {
			if(N > index) {
				index += six;
				six += 6;
				count++;
			} else
				break;
		}
		System.out.println(count);
	}
}

 

 

1193. 분수찾기

표를 돌려서 풀어보기!

규칙을 찾아보자면, 홀수일 때는 분모--, 분자++이고 짝수일 때는 분모++, 분자--이다.

그러므로 i를 1부터 증가시키면서, 홀수인지 짝수인지 판단해서 분모, 분자를 계산해주면 됨!

 

그리고 카운트를 하나 선언해놓고 분모, 분자 계산이 끝나면 1씩 증가시키면서 카운트가 14와 같을 때 break해주고 분수를 출력해주면 되는 문제이다.

 

여기서 헤맸던 점은 분모와 분자를 계산할 때 어떤 수를 기준으로 하느냐였는데 위에 표를 보면 뺄 때는 i가 기준이 되는 것을 볼 수 있다.

i가 2라면 2부터 빼주면 되고, 3이면 3부터 빼주면 되는 것! 더할 때는 0부터 차례로 1씩 더해주면 된다.

 

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		scan.close();
		
		//m:분모, n:분자
		int m = 0, n = 0, count = 0;
        for (int i=1; i<N; i++) {
            for (int j=0; j<i; j++) {
                if (i % 2 != 0) { //홀수
                    m = i - j;
                    n = j + 1;
                }else { //짝수
                    m = j + 1;
                    n = i - j;
                }
                count++;
                
                if (count == N) {
                    System.out.print(m+"/"+n);
                    break;
                }
            }
        }
	}
}

이렇게 풀었더니 시간초과 뜸. 그래서 break를 하나 더 걸어주었다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int N = scan.nextInt();
		scan.close();
		
		//m:분모, n:분자
		int m = 0, n = 0, count = 0;
		boolean flag = false;
        for (int i=1; i<N; i++) {
            for (int j=0; j<i; j++) {
                if (i % 2 != 0) { //홀수
                    m = i - j;
                    n = j + 1;
                }else { //짝수
                    m = j + 1;
                    n = i - j;
                }
                count++;
                if (count == N) {
                    System.out.print(m+"/"+n);
                    flag = true;
                    break;
                }
            }
            if(flag)
            	break;
        }
	}
}

 

 

10250. ACM 호텔

답은 나오는데 채점만 돌리면 틀렸다고 해서 엄청 헤맸다 ㅠㅠ 아래가 틀린 코드

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

		for(int t=0; t<T; t++) {
			int H = scan.nextInt();
			int W = scan.nextInt();
			int N = scan.nextInt();
			
			int XX=0, YY=0;
			
			if(H*W == N) {
				XX = (N / H);
				YY = H * 100;
			} else {
				XX = (N / H) + 1;
				YY = (N % H) * 100;
			}
			System.out.println(YY+XX);
		}
		scan.close();
	}
}

수정한 코드...!

4 + 3 일때 403, 12 + 3일때 1203을 만들어주어야 하므로 100을 YY에 곱해서 각각 400, 1200을 만들고 XX를 더해주면 됨!

(N - 1)을 해주지 않고 문제를 풀게 되면, 맨 꼭대기에 맨 끝 층일때 예외가 발생한다. 그러므로 -1 해주기

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int T = scan.nextInt();
		
		for(int t=0; t<T; t++) {
			int H = scan.nextInt();
			int W = scan.nextInt();
			int N = scan.nextInt();
			
			int XX = (N - 1) / H;
			int YY = (N - 1) % H;
			
			int resXX = XX + 1;
			int resYY = (YY + 1)*100;
			
			System.out.println(resYY+resXX);
		}
		scan.close();
	}
}