[백준/자바/JAVA] 14652 : 나는 행복합니다~


[문제]

“나는 행복합니다~ 한화라서 행복합니다~”

행복한 이 노래 가사! 그렇다. 욱제는 한화 이글스의 열렬한 이다. 욱제는 여름방학을 맞아 치킨과 맥주를 챙겨 야구장을 방문했다! 하지만 이게 웬걸? 치맥에 정신이 팔린 욱제는 그만 자신의 관중석 위치가 담긴 티켓을 잃어버리고 말았다. 욱제가 유일하게 기억하는 것이라고는 자신의 관중석 번호 K뿐이다.

당신은 한화 이글스의 감독이다. 열혈인 욱제의 방문에 깊은 감동을 받은 당신은 욱제가 잃어버린 자리를 찾아주려고 한다. 오늘 경기가 펼쳐지는 잠실구장은 세로 길이가 N, 가로 길이가 M인 N*M 크기의 관중석을 가지고 있다. 관중석의 왼쪽 위는 (0, 0), 오른쪽 아래는 (N-1, M-1)으로 표시된다. 각 관중석에는 번호가 아래 그림처럼 매겨져있다. (0, 0)에서부터 0번으로 시작하여 오른쪽으로, 끝에 다다르면 그 아래에서 또 오른쪽으로 숫자가 증가해나가는 식이다.

당신은 관중석의 크기와 욱제 자리의 번호를 알고 있다. 욱제가 잃어버린 자리는 어디일까? 자리를 찾아서 욱제에게 알려주도록 하자!

{ 입 출력 예제 }


[문제풀이]

문제의 이해

  • 내 좌석번호가 위치한 행과 열 찾기

접근법

  • 2중 for문으로 하는 방법
  • 수학적 계산식을 통해 접근하는 방법

수학적 계산법)

N = 열의 개수
M = 행의 개수
K = 열 기준 증감번호 ( 내 좌석 번호 )

(행열의 정의)

--행 찾기--

행 번호(rnum) =K(좌석번호)M(열의개수)=\left\lceil\cfrac{K(좌석 번호)}{M(열의 개수)}\right\rceil

KK 는 열 기준 증감하는 번호이기 때문에 열로 나누어지면 행이 나온다.

--열 찾기--

열 번호(cnum)

=좌석번호(열의개수×행번호)=좌석번호-(열의개수\times행번호)

=K(M×rnum)=\left\lceil K-(M\times rnum)\right\rceil

위 그림을 예로 들면 내 좌석은 6번 즉 1행에 있다.
열의 개수(4) ×\times 행 번호(1) = 4

또 만약 내 좌석을 9로 예를 들어보자
열의 개수(4) ×\times 행 번호(2) = 8 (내 좌석의 위 두줄)

열의 개수 ×\times 행번호
내 좌석으로부터 윗줄 전부를 의미하며
그 위줄 칸의 총 개수 이기도 하다.

즉, 열을 구하기 위해서 마지막으로
내 좌석 번호 에 위의 식 좌석이 위치한 행으로부터 윗줄 칸의 총 개수 를 빼주면 된다.


[코드작성]

방법1) 2중 for문

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

public class Main {
    private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int row = Integer.parseInt(st.nextToken());
        int column = Integer.parseInt(st.nextToken());
        int mysit = Integer.parseInt(st.nextToken());
        
        int count = 0;
        
        for(int i=0;i<row;i++) {
        	for(int j=0;j<column;j++) {
        	    if(mysit==count) {
                        bw.write(i+" "+j);
                        bw.flush();
                    }
                    count++;
        	}
        }
        bw.close();
    }
}

방법2) 수학적 계산

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

public class Main {
		private static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
	    public static void main(String[] args) throws IOException {
	        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	        StringTokenizer st = new StringTokenizer(br.readLine());

	        int N = Integer.parseInt(st.nextToken());
	        int M = Integer.parseInt(st.nextToken());
	        int K = Integer.parseInt(st.nextToken());
	        
	        bw.write(String.valueOf((K / M)+" "+(K - (M * (K / M)))));
	        bw.flush();
	        bw.close();
	        
	    }
}

좋은 웹페이지 즐겨찾기