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 |