14652번: 나는 행복합니다~ (acmicpc.net)

 

14652번: 나는 행복합니다~

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

www.acmicpc.net

 

칸의 위치로부터 행과 열의 위치를 계산하는 문제다.

 

앞으로도 2차원 기반 문제를 풀 때 Row&Col과 Index는 서로 자유롭게 변환할 수 있도록 익숙해져있어야하는데 그 초석을 다지는 문제다.

 

2차원 평면에서 행&열에 따라 순서를 0부터 매기는 경우 예를 들어 살펴보자.

아래는 3개 행(세로방향)과 4개 열로 이루어진 표다.

연한 회색으로 적힌 숫자는 행과 열의 번호를 의미하며, Index(순서)는 0부터 11까지 총 12개가 있다.

  0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11

우선 행(Row)부터 살펴보자.

0,1,2,3은 0행에 포함된다. 4,5,6,7은 1행에 포함된다.

규칙을 찾아보면 행은 열의 갯수만큼 Index가 증가할 때 마다 1씩 증가함을 알 수있다. 따라서 Index를 열의 갯수로 나누면 현재 행의 번호를 알 수 있다.

예를 들어 6의 경우 6을 열의 갯수인 4로 나누면 1(소숫점 버림)이 되고 이것이 행의 번호가 되는 것이다.

 

열(Column)의 경우 0,1,2,3이 한싸이클로 하여 4,5,6,7에서는 다시 열 번호가 0,1,2,3으로 계속적으로 반복됨을 알 수 있다.

따라서 Index를 열 갯수로 나눈 나머지로부터 열의 번호를 얻을 수 있다.

예를 들어 9의 경우 9를 4로 나눈 나머지는 1이고, 따라서 열 번호는 1이 된다.

 

이것을 이해하면 이 문제는 단순한 사칙연산 문제이므로 쉽게 풀릴 것이다.

 

 

코드

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] tokens = Console.ReadLine().Split(' ');

            int R = int.Parse(tokens[0]);
            int C = int.Parse(tokens[1]);
            int K = int.Parse(tokens[2]);

            int r = K / C;
            int c = K % C;

            Console.WriteLine($"{r} {c}");
        }
    }
}

'백준 > Bronze' 카테고리의 다른 글

[Bronze4][10808]알파벳 개수  (0) 2022.08.30
[Bronze5][14928]큰 수 (BIG)  (0) 2022.08.29
[Bronze5][1271]엄청난 부자2  (0) 2022.08.29
[Bronze5][2744]대소문자 바꾸기  (0) 2022.08.29
[Bronze4][15552]빠른 A + B  (0) 2022.08.29

+ Recent posts