Faits :
A.
Le 30 juin 2015, le Département de l'aménagement et des constructions de la Ville de Genève (ci-après: la Ville) a publié un appel d'offres en procédure ouverte pour des travaux de peinture, plâtrerie et faux plafonds relatifs à la rénovation de l'un de ses immeubles de logements. Treize offres ont été déposées, les prix devisés oscillant entre 515'160 fr. et 1'226'340 fr. toutes taxes comprises (ci-après: TTC). L'offre de la société B._ SA s'élevait à 515'160 fr. TTC et celle de la société A._ SA à 904'338 fr. 20 TTC. Au terme de la comparaison et de l'évaluation des treize offres précitées, B._ SA et A._ SA ont été classées au premier, respectivement au second rang.
B.
Par décision du 23 novembre 2015, la Ville a adjugé le marché à B._ SA pour un montant de 399'973 fr. 65 correspondant aux plâtreries et faux plafonds d'une part et pour un montant de 110'525 fr. 10 correspondant aux travaux de peinture d'autre part. La Chambre administrative de la Cour de justice de la République et canton de Genève (ci-après: la Cour de justice) a, par arrêt du 13 décembre 2016, rejeté le recours interjeté contre cette décision par A._ SA. Cette autorité avait au préalable rejeté la demande d'effet suspensif de A._ SA, de sorte qu'un contrat relatif au marché public litigieux avait pu être conclu entre la Ville et B._ SA.
C.
Agissant par la voie du recours constitutionnel subsidiaire, A._ SA conclut, sous suite de frais et dépens, à l'annulation de l'arrêt attaqué, à la constatation du caractère illicite de la décision d'adjudication des travaux de peinture d'une part et des travaux de plâtrerie et faux plafonds d'autre part à B._ SA, au renvoi de la cause à l'autorité précédente pour instruction de la demande de réparation (un délai étant imparti à la recourante pour fonder et motiver sa prétention en réparation du dommage) et au déboutement de toutes autres conclusions contraires de la Ville et de B._ SA; subsidiairement, au renvoi de la cause à l'autorité précédente pour nouvelle décision au sens des considérants et au déboutement de toutes autres conclusions contraires de la Ville et de B._ SA.
La Cour de justice et B._ SA ont renoncé à formuler des observations. La Ville a conclu au rejet du recours. La recourante n'a pas déposé de déterminations finales.
Considérant en droit :
1.
Le Tribunal fédéral examine d'office sa compétence (art. 29 al. 1 LTF [RS 173.110]). Il contrôle donc librement la recevabilité des recours qui lui sont soumis (ATF 141 II 113 consid. 1 p. 116).
1.1. L'arrêt attaqué a été rendu par un tribunal supérieur statuant en dernière instance cantonale en matière de marchés publics, sans qu'un recours auprès du Tribunal administratif fédéral ne soit ouvert (art. 86 al. 1 let. d et al. 2 LTF cum art. 114 LTF). Il peut donc en principe faire l'objet d'un recours en matière de droit public au Tribunal fédéral, à condition qu'il ne tombe pas sous le coup de l'exception prévue à l'art. 83 let. f LTF. Selon cette disposition, le recours en matière de droit public n'est recevable contre les décisions en matière de marchés publics qu'à la double condition que la valeur du mandat à attribuer soit supérieure ou égale aux seuils déterminants prévus à cet effet et que la décision attaquée soulève une question juridique de principe. Il incombe à la partie recourante, sous peine d'irrecevabilité, de démontrer la réalisation de ces deux conditions (cf. art. 42 al. 2 LTF; ATF 141 II 14 consid. 1.2 p. 20 s.).
1.2. A juste titre, la recourante ne prétend pas que ces conditions soient réunies en l'espèce, notamment au regard des griefs invoqués, lesquels ont déjà fait l'objet d'une abondante jurisprudence qu'il n'y a pas lieu de remettre en cause. Partant, la cause sera examinée sous l'angle de l'unique recours que la recourante a déclaré former, soit le recours constitutionnel subsidiaire (art. 113 ss LTF).
1.3. Pour le surplus, le recours est dirigé contre une décision finale (art. 90 LTF par renvoi de l'art. 117 LTF). Il a été déposé en temps utile (art. 100 al. 1 LTF par renvoi de l'art. 117 LTF) et dans les formes prescrites (art. 42 et 106 al. 2 LTF par renvoi de l'art. 117 LTF) par la destinataire de l'arrêt attaqué qui a un intérêt juridique à son annulation ou à sa modification (art. 115 LTF; consid. 5). Il est par conséquent recevable.
2.
Soulevant une violation de son droit d'être entendue, la recourante fait valoir que la Cour de justice aurait enfreint son obligation de motivation issue de l'art. 29 al. 2 Cst. en n'examinant pas son grief selon lequel la société adjudicataire ne respecterait pas le salaire minimum prévu par la Convention collective de travail du second oeuvre romand 2011 (ci-après: la CCT-SOR; consultable sur le site internet http://www.secondoeuvreromand.ch/default.asp/ 2-0-49-6-6-1/).
2.1. Le droit d'être entendu, garanti par l'art. 29 al. 2 Cst., implique notamment pour l'autorité l'obligation de motiver sa décision. La motivation d'une décision est suffisante, au regard du droit d'être entendu garanti par l'art. 29 al. 2 Cst., lorsque l'autorité mentionne, au moins brièvement, les motifs qui l'ont guidée et sur lesquels elle a fondé sa décision, de manière à ce que l'intéressé puisse se rendre compte de la portée de celle-ci et l'attaquer en connaissance de cause. L'autorité ne doit toutefois pas se prononcer sur tous les moyens des parties; elle peut se limiter à ceux qui, sans arbitraire, lui paraissent pertinents (cf. ATF 142 II 154 consid. 4.2 p. 157; 139 IV 179 consid. 2.2 p. 183; 138 I 232 consid. 5.1 p. 237). L'essentiel est que la décision indique clairement les faits qui sont établis et les déductions juridiques qui sont tirées de l'état de fait déterminant (ATF 141 IV 244 consid. 1.2.1 p. 246; 135 II 145 consid. 8.2 p. 153 et les références citées). La motivation peut être implicite et résulter des différents considérants de la décision (cf. ATF 141 V 557 consid. 3.2.1 p. 565).
2.2. La Cour de justice a, en l'occurrence, indiqué que la société adjudicataire avait démontré que le prix de ses offres couvrait le prix des matériaux et la main-d'oeuvre, sans présenter de risques pour l'entreprise. Les mandataires de la Ville avaient par ailleurs réalisé des analyses de prix afin de déterminer si la société adjudicataire était en mesure de fournir les prestations demandées tout en respectant les conditions sociales de travail. Il avait ainsi été confirmé que la société adjudicataire avait correctement analysé les heures de travail nécessaires. Celle-ci avait par ailleurs déclaré bénéficier de rabais importants de la part de ses fournisseurs au vu du volume de ses commandes. Elle avait en outre précisé ne pas faire de bénéfice sur le marché en question, sans pour autant travailler à perte. Dans ces conditions, la différence de prix entre les offres de la recourante et celles de la société adjudicataire ne pouvait seule être expliquée, comme le soutenait la recourante, par le paiement de salaires inférieurs à ceux prévus par la CCT-SOR. La recourante se bornait à substituer sa propre analyse et ses propres calculs, hypothétiques, à ceux des mandataires de la Ville et semblait considérer son offre comme une "offre étalon" permettant de déterminer le caractère admissible ou non des offres concurrentes. Or, les écarts théoriques auxquels aboutissait la recourante étaient sans pertinence pour déterminer si la société adjudicataire pouvait être considérée comme étant en mesure d'exécuter correctement le mandat au prix offert.
Une telle motivation suffit au regard des exigences posées par la jurisprudence. La recourante pouvait en effet saisir les motifs qui ont guidé l'autorité et attaquer sa décision à bon escient sur cette base, ce qu'elle a d'ailleurs fait. Mal fondé, son grief doit être rejeté. Le point de savoir si la rémunération de ses employés par la société adjudicataire est ou non conforme à la CCT-SOR sous l'angle de l'arbitraire dans l'application du droit cantonal relève quant à lui du fond, non du droit d'être entendu.
3.
3.1. Comme sa désignation l'indique, le recours constitutionnel subsidiaire ne peut être formé que pour violation des droits constitutionnels (art. 116 LTF). Conformément à l'art. 106 al. 2 LTF, auquel renvoie l'art. 117 LTF, le Tribunal fédéral n'applique pas le droit d'office et n'examine que les griefs constitutionnels qui sont invoqués et suffisamment motivés dans l'acte de recours (art. 117 et 106 al. 2 LTF; ATF 138 I 232 consid. 3 p. 237). Dans cette mesure, il revoit librement l'application du droit constitutionnel fédéral ou cantonal; dans le cadre d'un recours constitutionnel subsidiaire, il contrôle sous l'angle de l'arbitraire celle des dispositions législatives ou réglementaires fédérales ou cantonales (cf. ATF 139 I 169 consid. 6.1 p. 173; 138 I 242 consid. 5.2 p. 245).
3.2. Le Tribunal fédéral statue sur la base des faits constatés dans la décision attaquée; il ne peut rectifier ou compléter les constatations de fait de l'autorité précédente que si les faits ont été établis en violation des droits constitutionnels (art. 118 LTF en corrélation avec l'art. 116 LTF), soit arbitrairement (art. 9 Cst.), ce qu'il appartient à la partie recourante d'exposer et de démontrer de manière claire et circonstanciée (art. 117 et 106 al. 2 LTF; ATF 141 I 36 consid. 1.3 p. 41). Les faits et les critiques invoqués de manière appellatoire sont irrecevables (cf. ATF 137 II 353 consid. 5.1 p. 356).
Dans la mesure où la recourante présente une argumentation partiellement appellatoire, en opposant sa propre version des faits à celle de la Cour de justice, sans cependant invoquer ni l'arbitraire, ni une constatation manifestement inexacte des faits, le Tribunal fédéral ne peut pas en tenir compte. Il statuera donc sur la base des faits, tels qu'ils ressortent de l'arrêt attaqué.
4.
La recourante se plaint d'arbitraire dans l'application du droit cantonal. Elle fait en substance valoir que le salaire minimum versé par la société adjudicataire à ses employés serait de 31,9 % inférieur à celui qui devrait être versé en application de l'art. 20 du règlement cantonal genevois du 17 décembre 2007 sur la passation des marchés publics (RMP/GE; RS/GE L 6 05.01) mis en lien avec la CCT-SOR, charges sociales comprises. La recourante estime que l'offre de la société précitée aurait en conséquence dû être écartée d'office, conformément à l'art. 42 al. 1 let. a, b, c et e RMP/GE.
4.1. Selon l'art. 20 al. 1 RMP/GE, pour le personnel appelé à travailler sur le territoire genevois, les soumissionnaires et les sous-traitants doivent respecter les dispositions relatives à la protection sociale des travailleurs et aux conditions de travail applicables à Genève dans leur secteur d'activité.
La CCT-SOR s'applique à la plâtrerie et peinture dans le canton de Genève (art. 1 ch. 2 CCT-SOR). Elle traite notamment des salaires et de leurs composantes selon les divers modes de rémunération (art. 17 ss et Annexe II CCT-SOR).
A teneur de l'art. 42 al. 1 RMP/GE, l'offre est, notamment, écartée d'office lorsque le soumissionnaire a rendu une offre tardive, incomplète ou non-conforme aux exigences ou au cahier des charges (let. a), ne répond pas ou plus aux conditions pour être admis à soumissionner (let. b), a fourni de faux renseignements (let. c) ou n'a pas justifié les prix d'une offre anormalement basse, conformément à l'article 41 (let. e).
4.2. S'agissant des let. a et b de l'art. 42 al. 1 RMP/GE, le grief repose sur des faits qui ne ressortent pas de l'arrêt attaqué - notamment un mode de rémunération de type salaire-horaire (payé à l'heure) des employés de la société adjudicataire - sans que la recourante reproche aux juges cantonaux d'avoir procédé, sur ce point, à une constatation inexacte et incomplète de ceux-ci (ATF 136 V 362 consid. 4.1 p. 366; 130 III 28 consid. 4.4 p. 34). Il n'y a dès lors pas lieu de l'examiner.
Cela étant, il convient de relever que même si le prix de la main d'oeuvre devisé par la société adjudicataire n'était pas identique à la rémunération devant être calculée en vertu de la CCT-SOR ou d'autres dispositions relatives à la protection sociale des travailleurs et aux conditions de travail applicables dans le canton de Genève, ceci ne signifierait pas encore que la société précitée ne s'acquitterait pas des salaires et des autres montants dus conformément à ces dispositions. La recourante ne soutient d'ailleurs pas que la société adjudicataire n'aurait pas produit les attestations justifiant que la couverture du personnel en matière d'assurances sociales est garantie conformément à la législation en vigueur au siège du soumissionnaire et que ce dernier est à jour avec le paiement de ses cotisations, tel qu'exigé à l'art. 32 al. 1 let. a RMP/GE, ni non plus que des violations de la CCT-SOR de la part de ladite société auraient été constatées par les autorités chargées de veiller à sa bonne application en vertu des art. 50 CCT-SOR ss.
Quant aux let. c et e de l'art. 42 al. 1 RMP/GE, la recourante n'explique pas en quoi consisterait leur violation, de sorte que son argumentation, qui ne répond pas aux exigences de motivation de l'art. 106 al. 2 LTF, peut sans autre être écartée.
5.
La recourante invoque une inégalité de traitement entre concurrents économiques en citant l'art. 27 Cst. Elle reproche en substance à l'autorité précédente de ne pas avoir tenu compte des salaires et indemnités impérativement dus à ses employés par la société adjudicataire lors du contrôle du bien-fondé de l'évaluation de l'offre de cette dernière. La recourante aurait elle-même respecté les conditions de la CCT-SOR et aurait ainsi été désavantagée par rapport à la société adjudicataire. Cela étant et dès lors que la recourante fonde ses reproches sur des faits qui ne ressortent pas de l'arrêt attaqué - notamment la hauteur et le mode de rémunération de ses employés - et qu'il n'est pas établi que la société adjudicataire ne se conformerait pas à ses obligations sociales et salariales, le grief ne peut pas être traité (ATF 136 V 362 consid. 4.1 p. 366; 130 III 28 consid. 4.4 p. 34).
6.
Les considérants qui précèdent conduisent au rejet du recours. Succombant, la recourante doit supporter les frais judiciaires (art. 66 al. 1 LTF). Il n'est pas alloué de dépens (art. 68 al. 1 et 3 LTF).
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 2'000 fr., sont mis à la charge de la recourante.
3.
Le présent arrêt est communiqué au mandataire de la recourante, aux intimées et à la Cour de justice de la République et canton de Genève, Chambre administrative.
Lausanne, le 22 août 2017
Au nom de la IIe Cour de droit public
du Tribunal fédéral suisse
Le Président : Seiler
Le Greffier : Chatton