14652번 : 나는 행복합니다~

상환·2021년 12월 9일
0
post-thumbnail

문제

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

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

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

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

입출력

1. 입력

첫째 줄에 관중석의 크기를 나타내는 N, M과 잃어버린 관중석 번호를 나타내는 K가 주어진다. (1 ≤ N, M ≤ 30,000, 0 ≤ K ≤ N×M-1)

2. 출력

욱제의 잃어버린 자리를 찾아서, 잃어버린 자리의 좌표 (n, m)를 하나의 공백을 사이에 두고 숫자만 출력한다.

풀이

처음 문제를 봤을 때 주어지는 N,M으로 이차원 배열을 만들고 이차원 배열을 순차적으로 탐색하면서 잃어버린 관중석까지 도달하는 코드를 생각했다. 그래서 나온 코드가 아래 코드이다.

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

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            String[] range = br.readLine().split(" ");
            int lostSeat = Integer.parseInt(range[2]);  //잃어버린 좌석 번호
            int[][] seat = new int[Integer.parseInt(range[1])-1][Integer.parseInt(range[0])-1]; //좌석수
            //row, y좌표
            for(int i=0; i<seat.length; i++){
                //column, x좌표
                for (int j=0; j<seat[i].length; j++){
                    lostSeat--;
                    if(lostSeat==0){
                        System.out.println(j+" "+i);
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

당연하게도 메모리초과로 틀렸으며 순서까지 착각해서 오답으로 틀렸다. 메모리초과? 이차원 배열을 써서 그런가? 해서 이중for문으로만 해결했다.

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

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        try {
            String[] range = br.readLine().split(" ");
            int lostSeat = Integer.parseInt(range[2]);  //잃어버린 좌석 번호
            int row = Integer.parseInt(range[0]);
            int column = Integer.parseInt(range[1]);

            br.close();
            //row
            for (int i = 0; i < row; i++) {
                //column
                for (int j = 0; j < column; j++) {
                    if (lostSeat-- == 0) {
                        System.out.println(i + " " + j);
                        break;
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

결과는

풀었다.

풀고난 이후 저게 최선인지 다른사람들 풀이를 확인해봤는데 역시나 최선이 따로 있었다.

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

class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] seatInfo = br.readLine().split(" ");
        int M = Integer.parseInt(seatInfo[1]);
        int K = Integer.parseInt(seatInfo[2]);

        System.out.printf("%d %d\n", K / M, K % M);
        br.close();
    }
}

입력값 N, M중 N은 M이 최대로 나눠질 수 있는 횟수로 볼 수 있다.
따라서 row값은 자리번호 / M 이고 column값은 자리번호 % M으로 볼 수 있다.
이렇게 풀면 루프를 2번씩이나 돌릴 필요가 사라진다.

kotlin code

import java.io.BufferedReader
import java.io.InputStreamReader

fun main() {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val range = br.readLine().split(" ")
    var lostSeat = range.get(2).toInt()
    val row = range.get(0).toInt()
    val column = range.get(1).toInt()

    for (a in 0 until row){
        for (b in 0 until column){
            if(lostSeat-- == 0){
                print("$a $b")
                break;
            }
        }
    }
}

최적화된 풀이

import java.util.*

fun main(args: Array<String>) {
    val scan = Scanner(System.`in`)
    scan.nextInt()
    
    val m = scan.nextInt()
    val k = scan.nextInt()
    println("${k / m} ${k % m}")
}
profile
레모네이드 커피

0개의 댓글